java - 在同步中使用本质锁

标签 java multithreading synchronization

假设 d 是我们用来调用等待的对象。当线程调用 d.wait 时,它必须拥有 d 的内在锁 - 否则会引发错误。在同步方法内调用 wait 是获取内在锁的简单方法。

这是否意味着两个线程不能同时调用 wait() ?这里的内在锁是什么意思[将其称为监视器]?但是monitor是如何实现互斥的呢?

一旦线程调用wait,它会永远保留对象吗? 如果是这样,其他线程使用该锁进行notifyAll()怎么样?

如果我们需要在notifyall期间获取对象,那么为什么所有等待线程都被通知呢? 它不应该通知单独等待该对象的线程吗?

任何需要解释的代码都值得赞赏。

最佳答案

so is this means that two threads cannot invoke wait() at the same time?

纠正两个线程不能同时调用wait()的问题。然而,一旦一个线程处于 wait() 状态,另一个线程就可以获得相同的锁,并很快进入 wait() 状态。您可以让任意数量的线程等待同一个对象,但只有一个线程真正持有锁。

what do intrinsic lock here mean [mentioned it as Monitor]? but how 's monitor implemented to achive mutual exclusion?

只有一个线程可以在持有对象时运行。其他线程可能会阻塞尝试获取锁,并且更多线程可能会对其进行 wait()。

once the thread invokes wait does it holds object forever?

相反,它放弃它或者另一个线程几乎可以立即获取它。

if so how about other thread using that lock for notifyAll()?

如果对对象调用notifyAll(),所有等待()的线程都会依次被唤醒。这些线程一次只能获取一个锁,并且会尽快重新获取锁。

if we need to acquire object during notifyall, then why all waiting threads notified?

这就是notifyAll所做的,它被认为比使用notify更安全,notify会唤醒一个随机的,因为它不太容易出现编码错误。

shouldn't it notify threads waiting on that object alone?

这就是它的作用。


您应该注意这一点;

  • 在notify()/notifyAll()之前,您应该执行状态更改。您还应该在循环内使用 wait() 来检查状态更改。你需要这样做,因为 a) wait() 可能会错过 notification(),b) 它可能会被虚假唤醒 c) 另一个线程可能会获取你所做的任何事情,并且可能需要再次等待。
  • 在过去 9 年里,高级并发类的使用越来越多。使用这些类意味着您不需要直接使用线程、队列、wait() 和 notification()。

关于java - 在同步中使用本质锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17954419/

相关文章:

java - JAXB:当我们有很多类型的 xmlMessage 时,如何在 xmlMessage 与其 Java 类之间进行映射以进行解码

c++ - 用于最小值、最大值、中值、平均值的 OpenMp C++ 算法

java - 同步的行为

Java同步帮助请求

java - 如何优雅地停止java线程?

android - 由于未知的下载问题,同步 Gradle 失败

java - 使用 String 变量将 SVG 动态添加到 ImageView

java - Android Webview EvaluateJavascript 有时不返回响应

java - Substance 中的 JTree 连接线

java - 从线程创建 Intent