Java 并发:Synchronized(this) => 和 this.wait() 和 this.notify()

2024-03-10

我非常感谢您帮助理解以下内容的“并发示例”:http://forums.sun.com/thread.jspa?threadID=735386 http://forums.sun.com/thread.jspa?threadID=735386

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”。 然而在上面的例子中:

  1. 调用“出队”我将打开“锁定/监视器”this

  2. 现在我处于出队方法中。由于列表为零,调用线程将为“waited"

  3. 根据我的理解,我现在遇到了死锁情况,因为我将没有机会将对象(从另一个线程)排队,因为“出队”方法尚未完成并且出队“方法”持有锁定this:所以我永远不会有可能调用“enqueue”,因为我不会得到“this" lock.

背景:我有完全相同的问题:我有某种连接池(连接列表),如果检查所有连接,则需要阻止。如果大小超过限制或为零,同步列表到块的正确方法是什么?


See: http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#wait() http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#wait()

当前线程必须拥有该对象的监视器。线程释放 该监视器的所有权并等待另一个线程通知 在此对象的监视器上等待通过以下方式唤醒的线程 致电notify方法或notifyAll方法。然后线程 等待直到它可以重新获得监视器的所有权并恢复 执行。

所以不,不存在僵局。什么时候wait()被调用时,线程持有的监视器被释放,允许入队(以及同步的其他操作)this对象)在另一个线程上调用。当线程收到通知后,它将尝试再次获取监视器,然后再继续。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 并发:Synchronized(this) => 和 this.wait() 和 this.notify() 的相关文章

随机推荐