码迷,mamicode.com
首页 > 编程语言 > 详细

多线程下虚假唤醒问题

时间:2020-07-30 01:50:05      阅读:88      评论:0      收藏:0      [点我收藏+]

标签:多线程   进入   out   消费   解决   线程   sys   ted   getname   

背景

一个生产者,两个消费者;生产者对数值加1,当大于0时消费者进行消费,每次减去1.按道理来讲数值最小为0,但是实际运行时会出现负数。

原因,消费代码导致

/**
* 分析:消费者1得到执行,会进入wait状态,此时数值为0;然后生产者得到执行,数值变为1;消费2线程得到执行,数值变为0;
*  紧接着,消费1线程得到执行,此时不会重新判断数值,会接着继续往下执行,就是变为-1.
*/
public synchronized void sub(){
        try {
            if (num == 0){//解决办法:此处有问题,if改为while
                System.out.println(Thread.currentThread().getName());
                this.wait();
            }
            num--;
            System.out.println(Thread.currentThread().getName()+":"+num);
            this.notifyAll();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
        }

    }

多线程下虚假唤醒问题

标签:多线程   进入   out   消费   解决   线程   sys   ted   getname   

原文地址:https://www.cnblogs.com/xingrui/p/13401259.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!