首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java语言中,为什么一个线程在从.wait()唤醒后必须竞争资源?

在Java语言中,为什么一个线程在从.wait()唤醒后必须竞争资源?
EN

Stack Overflow用户
提问于 2018-11-07 04:31:11
回答 1查看 222关注 0票数 1

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

代码语言:javascript
复制
synchronized (this) {
  while (queue.isEmpty()) {
    this.wait();
  }
  queue.remove();
  this.notifyAll();
}

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

EN

回答 1

Stack Overflow用户

发布于 2018-11-07 04:57:50

这是一个幼稚的问题..多亏了这些评论,我想我现在理解了设计背后的逻辑:

  1. .wait()线程不能只在等待时持有锁,因为那样生产者就不能写入队列。
  2. .wait()线程唤醒时,为什么不能保证它获得锁呢?因为由于#1的原因,.wait()线程必须在开始等待之前释放资源。与此同时,其他消费者线程可能会进入.wait()阶段。既然有很多线程在等待,谁来获取资源呢?Java选择对所有线程一视同仁,更不用说等待时间了。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53179559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档