最近、BlockingQueue のエンキューの次の実装を見ました ( source )
public synchronized void enqueue(Object item)
throws InterruptedException {
while(this.queue.size() == this.limit) {
wait();
}
if(this.queue.size() == 0) {
notifyAll();
}
this.queue.add(item);
}
while
ループが必要な理由と、ループwhile
を置き換えることができる理由if (this.queue.size() == this.limit)
メソッドのエンキューが同期されているように見えるため、一度に 1 つのスレッドのみがメソッド本体で実行され、wait()
. this.queue.size() == this.limit
スレッドが通知されたら、再度状態を確認せずに先に進むことはできませんか?