我知道,我们使用这个习惯用法来等待通知来处理虚假唤醒:
synchronized (obj) {
while(somecond)
obj.wait();
}
如果出现虚假唤醒,我们将检查状态并返回等待。
但是,考虑一下这种情况:
- 我们开始等待,然后 obj.wait() 释放对 obj 的锁定。
- 操作系统虚假通知等待线程
- 我们返回检查条件(由于等待释放了 obj 锁)
- obj.notify() 在那一刻被调用。
是的,条件检查非常快,我们可以进行条件检查而不是在 obj.wait()
中的机会很小,可以忽略不计。在那种情况下,我们可以松开 obj.notify()
调用。
我是不是误解了什么,或者我们真的可以使用这种模式来取消通知?
最佳答案
另一个线程需要锁定 obj
才能调用 obj.notify()
。如果您的线程处于 while 循环中而不等待,它就无法拥有它,因为您的线程还需要锁定 obj
才能处于 while 循环中。
关于java - while(condition) { Object.wait() } 成语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21721401/