在多个线程中工作时,Java中的同步块是一个很棒的功能,这种情况经常发生。我知道它们的工作原理大多数,但是想要在结合wait和notify(All)时更加确定它们的工作方式。
通常当一个线程进入同步块时,在第一个线程离开之前,没有其他线程可以进入该块。但是,在同步对象上调用wait时不是这种情况。如果是这样,另一个线程将无法调用notify(All),这需要在调用之前与对象同步。
等待呼叫从同步中调出是否也是如此?或者,如果java在不同的块中找到notify(All),它是否只是例外?另外,当从一个同步块调用wait然后从另一个同步块通知(All)时,一个线程在继续之前是否等待另一个线程完成,如果是,那么哪一个?
现在我可以设置一个快速测试来回答大部分问题,我知道。但它不会回答更多技术性的东西,我相信这里有人可以。我不只是对什么时间和什么时候感兴趣,而是为什么。尝试搜索一些记录的信息,但找不到有关wait / notify(All)的任何有用信息。
修改
如果其他人感兴趣,这是测试结果。如果我们有Thread1,Thread2和Thread3,前两个等待释放,第三个是释放它们,那么顺序就是这样。
答案 0 :(得分:0)
是的,它有点特别。 wait
释放lock
中获取的synchronized block
并暂停它thread
(获取锁定的线程),这意味着其他线程将被允许获取锁定并修改状态。
现在通知或notifyAll将唤醒睡着的线程并重新获取lock