java - 通知对象后返回同步块后java的行为是什么
问题描述
我知道在我们wait()
对一个对象调用 a 之后,该对象的锁将释放以允许另一个线程通过同步块提供该锁并调用notify()
。在我们进入调用wait()
方法的同步块之前,我们获取锁并调用wait()
.
但在wait()
方法释放锁之后。
现在我的问题是在我们调用notify()
另一个线程之后,正在等待该对象的线程是否再次获取锁。
下面是一个简单的代码:
Object obj = new Object();
synchronized (obj) {
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
afterWait();
}
是jvm执行afterWait()
方法时对象获取的锁,因为它也在同步块中。
解决方案
在 Java 中,监视器是根据 Mess 的语义实现的。这意味着当当前线程需要等待时,它会释放监视器并加入其他等待线程以再次获取监视器。写的例子是不安全的,因为等待应该在一个循环中检查一些条件以再次等待,因为Java不保证线程只会在notify()
ornotifyAll()
方法的情况下被唤醒。它可能适用于您的开发环境,但在另一个环境中失败。此外,notify()
方法不保证线程会唤醒并获得锁,因为它可能无法获得信号,因此notifyAll()
唤醒所有等待锁的线程是安全的。
我是 Stack Overflow 的新手,所以我不确定我的共享知识是否直接解决了这个问题。
推荐阅读
- spring - 如何在集成测试中使用 RestTemplate 来验证 Wiremock 故障?
- docker - 使用 Docker 组合的主机名反向代理
- java - 解析包含 javascript 的字符串
- django - Django flatpages 空路径与这些中的任何一个都不匹配
- javascript - 修复了 mongodb 集合中文档数量的限制
- python - ortools中变量总和的AddAllDifferent约束
- javascript - 如何以编程方式清除聊天窗口中输入字段(发送框)的内容 | MS Bot 框架 | 直线机器人
- reactjs - JSX onClick 事件似乎被默认点击
- oracle - 在连接到 Oracle 数据库的 Crystal Reports 中将变量作为命令传递
- python - 打字:仅限于字符串列表