一尘不染

谁能解释线程监视器并等待?

java

工作中的某个人只是问了要在同步对象中包装等待的原因。

老实说,我看不出推理的原因。我了解javadocs所说的内容-
该线程需要成为对象监视器的所有者,但是为什么呢?它可以防止什么问题?(如果确实有必要,为什么wait方法不能获取监视器本身?)

我正在寻找一个相当深入的原因,或者可能是一篇文章的参考。我无法在快速的Google中找到一个。

哦,还有,thread.sleep比较起来如何?

编辑:非常好的答案-我真的希望我可以选择多个答案,因为它们都帮助我了解发生了什么。


阅读 141

收藏
2020-12-03

共1个答案

一尘不染

如果对象在调用Object.wait()时不拥有对象监视器,则在释放监视器之前,它将无法访问该对象以设置通知侦听器。而是将其视为尝试访问同步对象上的方法的线程。

或者换句话说,两者之间没有区别:

public void doStuffOnThisObject()

和以下方法:

public void wait()

在释放对象监视器之前,这两种方法都将被阻止。这是Java中的一项功能,可防止一个以上的线程更新对象的状态。它只是对wait()方法产生了意想不到的后果。

大概,wait()方法未同步,因为这可能会导致Thread在对象上具有多个锁的情况。(有关此信息,请参阅Java语言规范/锁定。)多个锁是一个问题,因为wait()方法只会撤消一个锁。如果该方法是同步的,则可以确保仅撤消该方法的锁,同时仍保留潜在的外部锁。这将在代码中创建死锁条件。

要回答有关Thread.sleep()的问题,Thread.sleep()不保证您正在等待的任何条件都得到满足。使用Object.wait()和Object.notify()允许程序员手动实现阻塞。发送通知已满足条件后,线程将解除阻塞。例如,从磁盘的读取已完成,并且线程可以处理数据。Thread.sleep()将要求程序员轮询是否已满足条件,如果不满足则返回睡眠状态。

2020-12-03