このセクションでは、java.util.concurrent.LinkedBlockingQueue.put()メソッドから、AtomicIntegerは必要ないと思います。 lock()内にスレッドが1つしかないことを考慮してください。私は正しいですか?ロック内のAtomicIntegerの使用方法
putLock.lockInterruptibly();
try {
while (count.get() == capacity) {
notFull.await();
}
enqueue(node);
c = count.getAndIncrement();
if (c + 1 < capacity)
notFull.signal();
} finally {
putLock.unlock();
}
多くの質問を確認しましたが、回答が見つかりませんでした。私の質問:そこに一つだけのスレッドがロックの内側にあるので、なぜそこに2つのロックがありますが、ここで
がプロデューサ/コンシューマキューに必要です。彼らは別のスレッドにあるからです。 'put'はプロデューサーのエンドポイントであり、' take'は消費者のエンドポイントです。 –
ああ、私は完全にその点を逃した。あなたに同意。ありがとう –
'put'と' take'が異なるロックを使用するという事実の他に、まったくロックを保持しないでアクセスすることもできます。 'size()'または 'remainingCapacity()'で指定します。また、 'peek()'と 'poll()'(タイムアウトなし)は、 'count'がゼロの時にロックを持たないショートカットを使います。 – Holger