【发布时间】:2020-01-24 11:30:16
【问题描述】:
我正在研究 Java 的生产者-消费者问题的多生产者和消费者用例。代码在github。相同的实现适用于 single producer consumer 用例,但在多生产者消费者情况下表现异常。
我对输出有一些疑问:
一开始,所有生产者和一个消费者都有锁:
Producer t1 has lock
t5 produced 1, integerQueue: [1]
Producer t5 notifiedAll
- 我认为所有线程都应该争夺锁,并且最多应该有一个线程拥有所有时间的锁?所有生产者都共享锁吗?生产者线程 t1 持有锁时,消费者线程 t5 是如何获得锁的?
运行一段时间后,又出现了一个奇怪的现象:
Producer t5 has lock
t5 produced 10, integerQueue: [8, 9, 10]
Producer t5 notifiedAll
Producer t5 has lock
t5 produced 11, integerQueue: [8, 9, 10, 11]
Producer t5 notifiedAll
Consumer t8 has lock
t8 consumed 8, integerQueue: [9, 10, 11]
Consumer t8 notified All
Consumer t8 has lock
t8 consumed 9, integerQueue: [10, 11]
Consumer t8 notified All
- 似乎除了一个生产者和消费者之外的所有线程都已死亡,而这两个线程正在相互切换锁。为什么会这样?所有其他生产者和消费者发生了什么?
非常感谢任何帮助。
【问题讨论】:
-
是的,我的错。
标签: java multithreading locking producer-consumer