例如,在这个经典的消费者-生产者代码片段中:
synchronized (this) {
while (queue.isEmpty()) {
this.wait();
}
queue.remove();
this.notifyAll();
}生产者通知的.wait()消费者线程将被唤醒,然后与等待synchronized (this)的其他消费者线程竞争资源。这会导致竞争条件。但是为什么不简单地让.wait()使用者持有资源,直到它存在于synchronized块中?
发布于 2018-11-07 04:57:50
这是一个幼稚的问题..多亏了这些评论,我想我现在理解了设计背后的逻辑:
.wait()线程不能只在等待时持有锁,因为那样生产者就不能写入队列。.wait()线程唤醒时,为什么不能保证它获得锁呢?因为由于#1的原因,.wait()线程必须在开始等待之前释放资源。与此同时,其他消费者线程可能会进入.wait()阶段。既然有很多线程在等待,谁来获取资源呢?Java选择对所有线程一视同仁,更不用说等待时间了。https://stackoverflow.com/questions/53179559
复制相似问题