这个代码片段来自java concurrency in practice,我真的不明白。
@ThreadSafe
public class BoundedBuffer<V> extends BaseBoundedBuffer<V> {
// CONDITION PREDICATE: not-full (!isFull())
// CONDITION PREDICATE: not-empty (!isEmpty())
public BoundedBuffer(int size) { super(size); }
// BLOCKS-UNTIL: not-full
public synchronized void put(V v) throws InterruptedException {
while (isFull())
wait();
doPut(v);
notifyAll();
}
// BLOCKS-UNTIL: not-empty
public dsynchronize V take() throws InterruptedException {
while (isEmpty())
wait();
V v = doTake();
notifyAll();
return v;
}
}
put 和 take 方法是同步的。如果某个线程在 put 方法中等待,则没有人可以进入 take 或 put 方法,因此,在大多数情况下,如果一个线程开始等待,它将永远等待。
我错过了什么吗?