这段代码在实践中来自java并发,我真的不明白。
@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方法,因此,在大多数情况下,如果线程开始等待,它将等待永远。
我想念一些事吗?
答案 0 :(得分:3)
它是synchronized
但wait()
方法在等待时释放了锁 - 这就是它的工作原理。然后该线程将阻塞,直到通知为止。一旦通知它重新获取锁定并继续。引用Object.wait()
javadocs:
使当前线程等待,直到另一个线程为此对象调用java.lang.Object.notify()方法或java.lang.Object.notifyAll()方法。换句话说,此方法的行为就像它只是执行call wait(0)一样。
当前线程必须拥有此对象的监视器。线程释放此监视器的所有权并等待,直到另一个线程通过调用notify方法或notifyAll方法通知等待此对象监视器的线程唤醒。然后该线程等待,直到它可以重新获得监视器的所有权并继续执行。
我建议您更多地阅读有关Java concurrency的内容,特别是guarded blocked上的这一部分。
更典型的是,具体指定您正在等待和通知的对象。 wait()
调用应该是this.wait()
和this.notifyAll()
,这样可以更轻松地找出受影响的锁定。