假设线程T1正在等待进入同步块,并且线程T2在块内是wait()
,并且线程T3在块的监视器上调用notify()
。
在T2进行之前T1是否可以进入该区块?或者T2优先吗?
答案 0 :(得分:3)
在T2进行之前T1是否可以进入该区块?
是的,这是可能的。 Object.wait(int)
的javadoc未指定已通知的线程优先。实际上,它指定应用普通调度规则。
"然后从该对象的等待集中删除线程T并重新启用线程调度。然后它以通常的方式与其他线程竞争,以便在对象上同步..."
这就是为什么需要像这样编码条件变量
的原因之一 private boolean condition = ...
private Object lock = new Object(); // mutex for 'condition'
...
synchronize (lock) {
while (!condition) {
wait(lock);
// It is UNSAFE to assume that 'condition' is true now.
}
}