gpt4 book ai didi

java - 在对象上通知后返回同步块(synchronized block)后java的行为是什么

转载 作者:行者123 更新时间:2023-11-30 06:01:04 25 4
gpt4 key购买 nike

我知道在我们对一个对象调用 wait() 之后,该对象的锁将释放以允许另一个线程通过同步块(synchronized block)提供该锁并调用 notify( )。在我们进入调用了 wait() 方法的同步块(synchronized block)之前,我们获取锁并调用 wait()

但在 wait() 方法之后释放锁。

现在我的问题是在我们在另一个线程中调用 notify() 之后,正在等待该对象的线程是否再次获取锁。

下面是一个简单的代码:

Object obj = new Object();
synchronized (obj) {
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
afterWait();
}

是jvm是否执行afterWait()方法时获取对象的锁,因为它也在synchronized block 中。

最佳答案

在Java中,监视器是根据Mess的语义实现的。这意味着当当前线程需要等待时,它释放监视器并加入其他等待线程再次获得监视器。写的例子是不安全的,因为 wait 应该在一个循环中检查一些条件再等待,因为 Java 不保证只有在 notify()notifyAll() 方法。它可能适用于您的开发环境,但在另一个开发环境中失败。此外,notify() 方法不保证线程会唤醒并获得锁,因为它可能没有收到信号,因此执行 notifyAll() 是安全的唤醒所有等待锁的线程。

我是 Stack Overflow 的新手,所以我不确定我的共享知识是否直接针对问题。

关于java - 在对象上通知后返回同步块(synchronized block)后java的行为是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59110854/

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