多线程下虚假唤醒问题
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 {
}
}
以上是关于多线程下虚假唤醒问题的主要内容,如果未能解决你的问题,请参考以下文章
多线程编程中条件变量和的spurious wakeup 虚假唤醒
[C++11 多线程同步] --- 条件变量的那些坑条件变量信号丢失和条件变量虚假唤醒(spurious wakeup)