125-多Produce多Consume之间的通讯导致出现程序假死的原因分析
多个生产者、消费者线程运行时,会产生一些问题
Stream.of("P1", "P2").forEach(n ->
new Thread(() -> {
while (true) {
pc.produce();
}
}, n).start()
);
Stream.of("C1", "C2").forEach(n ->
new Thread(() -> {
while (true) {
pc.consume();
}
}, n).start()
);
此时运行程序会先正常运行一段时间,然后卡住。使用jstack
查看程序也并没有发生死锁。那么,产生的原因是什么?
分析:在消费者1消费完成后进行notify()
操作时,并没有指定唤醒哪个线程,此时有可能唤醒的是消费者2线程。然后消费者2唤醒后发现后并没有可以消费的数据,又自行wait,此时所有生产者线程也是处于wait状态,所有线程都BLOACKED,在等待被唤醒,进而造成了线程假死的情况。
notify()
唤醒的是持有同样MONITOR锁的线程,且只唤醒一个线程。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 tuyrk@qq.com
文章标题:125-多Produce多Consume之间的通讯导致出现程序假死的原因分析
文章字数:236
本文作者:神秘的小岛岛
发布时间:2019-11-30, 17:06:59
最后更新:2019-11-30, 17:37:05
原始链接:https://www.tuyrk.cn/wang-thread/125-multi-prod-cons/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。