在同步阻止后面

时间:2015-11-19 10:41:16

标签: java multithreading synchronized

在多个线程中工作时,Java中的同步块是一个很棒的功能,这种情况经常发生。我知道它们的工作原理大多数,但是想要在结合wait和notify(All)时更加确定它们的工作方式。

通常当一个线程进入同步块时,在第一个线程离开之前,没有其他线程可以进入该块。但是,在同步对象上调用wait时不是这种情况。如果是这样,另一个线程将无法调用notify(All),这需要在调用之前与对象同步。

等待呼叫从同步中调出是否也是如此?或者,如果java在不同的块中找到notify(All),它是否只是例外?另外,当从一个同步块调用wait然后从另一个同步块通知(All)时,一个线程在继续之前是否等待另一个线程完成,如果是,那么哪一个?

现在我可以设置一个快速测试来回答大部分问题,我知道。但它不会回答更多技术性的东西,我相信这里有人可以。我不只是对什么时间和什么时候感兴趣,而是为什么。尝试搜索一些记录的信息,但找不到有关wait / notify(All)的任何有用信息。

修改

如果其他人感兴趣,这是测试结果。如果我们有Thread1,Thread2和Thread3,前两个等待释放,第三个是释放它们,那么顺序就是这样。

  1. Thread1进入并调用wait()
  2. Thread2进入并调用wait()
  3. Thread3进入并调用notifyAll()
  4. Thread3完成,总是
  5. 但等待的线程没有特定的顺序。首先执行哪一个是完全随机的,与他们调用wait()的顺序无关。然而,调用notify(All)的线程将始终在任何等待线程继续之前完成。

1 个答案:

答案 0 :(得分:0)

是的,它有点特别。 wait释放lock中获取的synchronized block并暂停它thread(获取锁定的线程),这意味着其他线程将被允许获取锁定并修改状态。 现在通知或notifyAll将唤醒睡着的线程并重新获取lock