【发布时间】:2019-04-10 07:09:19
【问题描述】:
例如在这个经典的消费者-生产者代码 sn-p 中:
synchronized (this) {
while (queue.isEmpty()) {
this.wait();
}
queue.remove();
this.notifyAll();
}
生产者通知的.wait()消费者线程将被唤醒,然后与等待synchronized (this)的其他消费者线程竞争资源。这会导致竞争条件。但是为什么不简单地让.wait() 消费者持有资源,直到它存在synchronized 块?
【问题讨论】:
-
你说的是
wait()消费者之间的公平吗? -
好吧,如果另一个消费者也想要资源,你如何决定谁获得资源?我的意思是,你的解决方案是什么?如果多个消费者尝试获取资源,谁来决定首选哪个消费者?
-
这不是竞争条件。这是不公平的,可能会导致饥饿。您通常需要做出决定以进行公平调度或获得最后一点性能。 Java 选择了后者。
-
@k5_ ... 并给了
ReentrantLock支持前者。 -
@AKSW 我的意思是,让
.wait()线程在睡眠时保持锁定。这样,同步块中将只有一个线程可以执行。
标签: java multithreading locking synchronized producer-consumer