有人能解释一下线程监视器并等待吗?

有人在工作中问,为什么必须在一个同步的文件中包含等待

老实说,我不明白其中的道理。我理解javadocs所说的——线程需要是对象监视器的所有者,但为什么呢?它能防止什么问题?(如果确实有必要,为什么wait方法不能获得监视器本身?)

我正在寻找一个相当深入的为什么或者一篇文章的参考。我无法在快速的谷歌中找到一个

哦,还有,thread.sleep比较怎么样

编辑:一组很棒的答案——我真的希望我能选择不止一个,因为它们都帮助我理解发生了什么

这里已经有很多好答案了。但是我想在这里提到的是,使用wait()时,另一个必须做的事情是根据您等待的条件在循环中执行,以防您看到虚假的唤醒,根据我的经验,这种情况确实会发生

要等待其他线程将条件更改为true并通知:

已同步(o){
而(!checkCondition()){
o、 等待();
}
}

当然,现在我建议只使用新的Condition对象,因为它更清晰,有更多的特性(比如允许每个锁有多个条件,能够检查等待队列长度,更灵活的调度/中断,等等)

Lock Lock=new ReentrantLock();
Condition Condition=lock.newCondition();
lock.lock();
试一试{
而(!checkCondition()){
条件wait();
}
}最后{
lock.unlock();
}

}

发表评论