多线程下虚假唤醒问题

Posted xingrui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程下虚假唤醒问题相关的知识,希望对你有一定的参考价值。

背景

一个生产者,两个消费者;生产者对数值加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 {
        }

    }

以上是关于多线程下虚假唤醒问题的主要内容,如果未能解决你的问题,请参考以下文章

JAVA线程虚假唤醒

Java多线程虚假唤醒问题(生产者和消费者关系)

Java多线程虚假唤醒问题

java多线程 生产者消费者案例-虚假唤醒

多线程编程中条件变量和的spurious wakeup 虚假唤醒

[C++11 多线程同步] --- 条件变量的那些坑条件变量信号丢失和条件变量虚假唤醒(spurious wakeup)