【问题标题】:Java Concurrency : Synchronized(this) => and this.wait() and this.notify()Java并发:Synchronized(this) => and this.wait() and this.notify()
【发布时间】:2010-05-19 04:18:59
【问题描述】:

如果您能帮助理解以下“并发示例”,我将不胜感激: 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. 调用“dequeue”我将在this上获得“锁定/监控”

  2. 现在我在 dequeue 方法中。由于列表为零,调用线程将是“waited

  3. 据我了解,我现在遇到了死锁情况,因为“出队”方法尚未完成,出队“方法”将锁定锁定this:所以我永远不可能调用“enqueue”,因为我不会得到“this”锁。

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

【问题讨论】:

    标签: java concurrency


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      没有死锁,因为调用wait会放弃锁。 你可以看看这个: Why must wait() always be in synchronized block

      【讨论】:

      • 感谢您的帮助,链接非常有见地!
      猜你喜欢
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 2021-10-19
      • 2013-01-11
      • 2012-08-18
      • 1970-01-01
      • 2019-03-24
      • 1970-01-01
      相关资源
      最近更新 更多