Java Wait/Notify 在可重入同步块中

Java Wait/Notify Within Reentrant Synchronized Blocks

我对 Java synchronized() 块的理解是,如果一个线程已经拥有一个对象上的锁,它可以进入在同一对象上同步的不同块(可重入同步)。在下面,我相信JVM使用引用计数来increment/decrement线程获得锁的次数,并且只有当计数为零时才会释放锁。

所以我的问题是,如果遇到这样一段代码:

synchronized(this)
{
    if (condition == WAITING)
    {
        synchronized(this)
        {
            condition = COMPLETE;

            notify();

            try
            {
                wait();
            }
            catch(InterruptedException  e)
            {
            }
        }
    }
    else
        condition = READY;
}

调用 wait() 时具体发生了什么?它只是减少计数,还是释放锁而不考虑计数?

在第一种情况下,在我看来,如果发生锁重新进入,它将产生死锁,因为它仍将拥有锁,因此将永远等待另一个正在等待它的线程。

第二种情况,我完全看不出第二个synchronized块的意义是什么

wait() 的文档说

"The current thread must own this object's monitor. The thread releases ownership of this monitor and waits until another thread notifies threads waiting on this object's monitor to wake up either through a call to the notify method or the notifyAll method. The thread then waits until it can re-obtain ownership of the monitor and resumes execution,"

所以我认为第二种情况是正确的,但我可能是错的。那么我是不是遗漏了什么,或者我只是遇到了一个可以很容易地从代码中删除的冗余同步块?

if 之后没有什么需要重新获取锁。

wait()也会完全释放锁(否则很容易死锁)

我能看到的第二个 synchronized 的唯一原因是它以前使用了另一个对象,有人错误地将其修改为使用相同的 this