Java中的Synchronized blocks在多线程中工作时是一个很好的特性,这是非常常见的。我知道它们是如何工作的,但希望更确定它们在与等待和通知(所有)结合时是如何工作的。
通常,当一个线程进入同步块时,在第一个线程离开之前,其他线程不能进入该块。但是,当调用synchronized对象的wait时,情况就不是这样了。如果这样做了,另一个线程将无法调用notify(All),这需要在调用对象之前与对象同步。
那么等待的呼叫是否会使呼叫脱离同步?或者java只是在不同的块中发现notify(All)时做一个异常吗?另外,当从一个同步块调用wait,然后从另一个同步块调用notify(All)时,一个线程在继续之前是否等待另一个线程完成,如果是,是哪个线程?
现在我可以设置一个快速测试来回答我所知道的大部分问题。但它不能回答更多的技术问题,我相信这里的人可以。我不仅对什么和什么时候感兴趣,而且对为什么感兴趣。尝试搜索一些文档化的信息,但找不到任何关于wait/notify(全部)的有用信息。
编辑:
是的,这有点特别。wait
释放在synchronized块
中获取的锁
,并挂起它的线程
(获取锁的线程),这意味着其他线程将被允许获取锁并修改状态。现在notify或notifyAll将唤醒已睡眠的线程/s,它们将重新获得锁
问题内容: 我正在查看包含同步方法的第三方库中的一些代码,在此方法中,有一个锁定在实例变量上的同步块。与此类似: 这有意义吗?如果是这样,在同步方法中使用同步语句有什么好处? 鉴于同步方法锁定了整个对象,对我来说似乎是多余的。在使用非私有的实例变量时,这种方法是否有意义? 问题答案: 在您的示例中,该方法 同时 锁定了和的实例。其他方法可能仅锁定对象的实例 或 对象。 因此,是的,这完全取决于他们
问题内容: 我了解到,调用对象的方法将释放对象监视器(如果存在)。 但是我对通过另一个线程调用该对象有一些疑问: (何时)等待线程唤醒,如果同时有另一个(第3个)线程拥有对象监视器? 如果在该对象上调用了第三个线程,等待线程将被唤醒吗? 是否可以确定线程是否正在等待通知特定对象(java 1.4 / java 5) 如果将在方法中调用会发生什么情况? 问题答案: 将唤醒在监视器上等待的一个线程。除
主要内容:1 什么是Java同步代码块,2 Java同步代码块的要点,3 Java同步代码块的语法,4 Java同步代码块的例子1,5 Java同步代码块的例子21 什么是Java同步代码块 同步代码块可用于对方法的任何特定资源执行同步。 假设您的方法中有50行代码,但是您只想同步5行,则可以使用synchronized代码块。 如果将方法的所有代码放在同步代码块中,它的效果与同步方法相同。 2 Java同步代码块的要点 同步代码块用于锁定任何共享资源的对象。 同步代码块的范围小于该方法。 3
问题内容: 我在Heinz Kabutz的 Java专家 通讯版本中看到了这一点,尽管Kabutz博士的文章的其余部分(乃至全部)都得到了很好的解释和详细说明,但他似乎掩盖了这段代码的作用,或更重要的是,它的意义是: 嵌套块的含义是什么?这如何影响尝试执行的不同线程? 问题答案: 有两个可能需要注意的问题 如果使用等待/通知,嵌套锁很容易导致死锁。这是为什么的解释。http://tutorials
这个练习直接来自SCJP,由凯西·塞拉和伯特·贝茨完成 同步代码块 在这个练习中,我们将尝试同步一个代码块。在该代码块中,我们将获得对象的锁,以便其他线程在代码块执行时无法修改它。我们将创建三个线程,它们都将尝试操作同一对象。每个线程将输出一个字母100次,然后将该字母递增一次。我们将使用的对象是StringBuffer。 我们可以在一个String对象上进行同步,但是字符串一旦创建就不能被修改,
我正在寻找有关同步块的澄清。考虑一下这个类 - A是单例。getValue在整个应用程序中被多个线程大量访问。我添加了一个新方法remove,它从映射中删除一个键。如果如上所述执行删除, 当线程位于remove方法的同步块中时,我假设它将获取map对象上的锁。这是否意味着其他试图通过getValue方法访问映射的线程将被阻止?(我希望他们这样做。) 当remove方法的同步块中没有线程时,访问ge