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" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏