2011-06-07 90 views
16

在对象上线程可以wait之前,它必须获取该对象上的监视器。监视器随后被释放,并且该线程一旦被唤醒就试图重新获取它。Java:线程在对象上等待时是否释放所有监视器?

但是当线程调用wait时线程保持其他监视器会发生什么?

考虑这个例子:

 
    Object a = // ... 
    Object b = // ... 

    synchronized(a) 
    { 
     synchronized(b) 
     { 
      b.wait(); 
      // continue 
     } 
    } 

当线程调用b.wait(),将其发布在ab,或仅b锁?

回答

15

只有b

这些类型的问题的权威来源是Java语言规范。在这种情况下的相关部分是17.8 Wait Sets and Notification

让螺纹是线程上执行对象 wait方法,并让Ñ通过是锁定动作的数量在m未被解锁动作匹配。以下操作之一发生。

  • [...]
  • 否则,按以下顺序发生:

    1. 螺纹被添加到等待集中对象的,并且执行Ñ解锁动作on m
    2. [...]
7

AFAIK only b。这是死锁的经典来源。

10

Object class的Java API文档:

当前线程必须拥有该 对象的监视器。该线程释放的这款显示器 所有权并等待 直到另一个线程通知 等待在该对象的监视器上 唤醒无论是通过调用 通知方法或notifyAll方法。 线程然后等待,直到 重新获得显示器的所有权,并且 恢复执行。

因此,致电b.wait()只解锁b

相关问题