gpt4 book ai didi

可重入同步块(synchronized block)中的 Java 等待/通知

转载 作者:行者123 更新时间:2023-11-29 06:58:41 25 4
gpt4 key购买 nike

我对 Java synchronized() block 的理解是,如果一个线程已经拥有一个对象上的锁,它可以进入在同一对象上同步的不同 block (可重入同步)。在底层,我认为 JVM 使用引用计数来递增/递减线程获取锁的次数,并且只有在计数为零时才会释放锁。

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

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

notify();

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

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

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

在第二种情况下,我根本看不出第二个同步块(synchronized block)的意义是什么。

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,"

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

最佳答案

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

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

第二个的唯一原因synchronized我可以看到,它以前使用了另一个对象并且有人修改它以使用相同的 this错误。

关于可重入同步块(synchronized block)中的 Java 等待/通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29677085/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com