Java:线程在对象上等待时是否释放所有监视器?

Ton*_*ony 19 java multithreading synchronized wait

在线程可以wait在对象上之前,它必须获取该对象上的监视器.然后释放监视器,一旦唤醒,线程就会尝试重新获取它.

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

考虑这个例子:

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

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

当线程调用b.wait(),它会释放对锁 ab,或只b

aio*_*obe 17

只有b.

这类问题的专制来源是Java语言规范.本案例中的相关部分是17.8等待集和通知:

让螺纹是线程上执行对象的等待方法,并让Ñ是锁定动作由数量尚未由解锁操作相匹配.发生以下操作之一.

  • [...]
  • 否则,将发生以下序列:

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


Vin*_*lds 11

Object类的Java API文档:

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

因此,调用仅b.wait()释放锁定b.


cad*_*ian 7

仅AFAIK b.这是死锁的经典来源.