例如,在这个经典的消费者-生产者代码片段中:
synchronized (this) {
while (queue.isEmpty()) {
this.wait();
}
queue.remove();
this.notifyAll();
}
被生产者通知的.wait()
消费者线程将被唤醒,然后与正在等待synchronized(this)
的其他消费者线程竞争资源。这会导致竞争条件。但为什么不简单地让 .wait()
使用者保留资源,直到它存在于 synchronized
block 为止?
最佳答案
这是一个天真的问题..感谢评论,我想我现在理解了设计背后的逻辑:
.wait()
线程在等待时不能只持有锁,因为这样生产者就无法写入队列。- 当
.wait()
线程唤醒时,为什么不能保证它获得锁?因为由于原因 #1,.wait()
线程必须在开始等待之前放弃资源。与此同时,其他消费者线程可能会到达.wait()
阶段。既然有很多线程在等待,那么谁应该获得资源呢? Java 选择对所有线程一视同仁,更不用说等待时间了。
关于java - 在Java中,为什么线程从.wait()唤醒后必须竞争资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53179559/