java - 在Java中,为什么线程从.wait()唤醒后必须竞争资源?

标签 java multithreading locking synchronized producer-consumer

例如,在这个经典的消费者-生产者代码片段中:

synchronized (this) {
  while (queue.isEmpty()) {
    this.wait();
  }
  queue.remove();
  this.notifyAll();
}

被生产者通知的.wait()消费者线程将被唤醒,然后与正在等待synchronized(this)的其他消费者线程竞争资源。这会导致竞争条件。但为什么不简单地让 .wait() 使用者保留资源,直到它存在于 synchronized block 为止?

最佳答案

这是一个天真的问题..感谢评论,我想我现在理解了设计背后的逻辑:

  1. .wait() 线程在等待时不能只持有锁,因为这样生产者就无法写入队列。
  2. .wait()线程唤醒时,为什么不能保证它获得锁?因为由于原因 #1,.wait() 线程必须在开始等待之前放弃资源。与此同时,其他消费者线程可能会到达 .wait() 阶段。既然有很多线程在等待,那么谁应该获得资源呢? Java 选择对所有线程一视同仁,更不用说等待时间了。

关于java - 在Java中,为什么线程从.wait()唤醒后必须竞争资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53179559/

相关文章:

java - 拦截groovy中所有元类的所有方法调用

java - 如何使用插件以编程方式获取 eclipse 标签列表

python - 从 raw_input() 读取输入而不会被 Python 中的其他线程覆盖提示

c++ - 解释 gperftools 在多线程工作负载上的结果

不同机器上的应用程序访问时的 SQLite 同步

java - 我可以使用反射发现 Java 类的声明内部类吗?

java - 如何在字符串中搜索多个单词

c++ - 线程构造的性能成本 : missed optimisations and memory allocation

C# - 对锁感到困惑

c++ - 如何保护类外用户可以修改的指针地址? C++