Java并发:同步(this)=>和this.wait()和this.notify()
感谢您帮助理解“并发示例”: http : //forums.sun.com/thread.jspa?threadID = 735386
Qute开始:
public synchronized void enqueue(T obj) { // do addition to internal list and then... this.notify(); } public synchronized T dequeue() { while (this.size()==0) { this.wait(); } return // something from the queue }
报价结束:
我的问题是:为什么这段代码有效?
=>当我同步像“ public synchronized
”=>这样的方法时,我同步“对象的实例==> this
”。 但是在上面的例子中:
-
调用“出列”我会得到“锁定/监视”
-
现在我在出队方法。 由于列表为零,调用线程将“
waited
” - 根据我的理解,我现在有一个死锁情况,因为我没有机会从一个其他线程中获取一个对象,因为“dequeue”方法还没有完成,并且dequeue“method”持有
this
的锁定:所以我永远不会有可能称之为“enequeue”,因为我不会得到“this
”锁定。
Backround:我有完全相同的问题:我有一些连接池(连接列表),如果检查所有连接,需要阻止。 如果大小超过限制或为零,将List同步到阻止的正确方法是什么?
非常感谢你
延
请参阅: http : //docs.oracle.com/javase/7/docs/api/java/lang/Object.html#wait()
当前线程必须拥有此对象的监视器。 该线程释放此监视器的所有权并等待,直到另一个线程通过调用
notify
方法或notifyAll
方法通知等待此对象监视器的线程唤醒。 然后线程等待,直到它可以重新获得监视器的所有权并继续执行。
所以不,没有僵局。 当调用wait()
,线程保持的监视器被释放,允许在另一个线程上调用enqueue(以及在this
对象上同步的其他操作)。 通知线程时,它将尝试再次获取监视器,然后继续。
没有死锁因为调用wait会放弃锁定。 你可能会检查出来: 为什么wait()总是在同步块中