gpt4 book ai didi

java : Does wait() release lock from synchronized block

转载 作者:IT老高 更新时间:2023-10-28 20:25:40 25 4
gpt4 key购买 nike

我的印象是 wait() 释放所有锁,但我发现这篇文章说

“在同步方法中调用等待是获取内在锁的简单方法”

请澄清我有点困惑。

http://docs.oracle.com/javase/tutorial/essential/concurrency/guardmeth.html

最佳答案

“在同步方法中调用等待是获取内在锁的简单方法”

这句话是假的,是文档中的错误。

线程在进入同步方法时获取内在锁。同步方法中的线程被设置为锁的所有者,并且处于RUNNABLE状态。任何试图进入锁定方法的线程都会变成BLOCKED

当线程调用 wait 时,它会释放当前对象锁(它保留来自其他对象的所有锁),然后进入 WAITING 状态。

当其他线程在同一个对象上调用 notify 或 notifyAll 时,第一个线程将状态从 WAITING 更改为 BLOCKED,通知线程不会自动重新获取锁或变为 RUNNABLE,实际上它必须与所有其他阻塞线程争夺锁。

WAITING 和 BLOCKED 状态都阻止线程运行,但它们有很大不同。

WAITING 线程必须通过来自其他线程的通知显式转换为 BLOCKED 线程。

WAITING 永远不会直接进入 RUNNABLE。

当 RUNNABLE 线程释放锁(通过离开监视器或等待)时,一个 BLOCKED 线程会自动取而代之。

总而言之,线程在进入同步方法或等待后重新进入同步方法时获取锁。

public synchronized guardedJoy() {
// must get lock before entering here
while(!joy) {
try {
wait(); // releases lock here
// must regain the lock to reentering here
} catch (InterruptedException e) {}
}
System.out.println("Joy and efficiency have been achieved!");
}

关于 java : Does wait() release lock from synchronized block,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13249835/

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