当前位置:网站首页 > 编程语言 > 正文

条件变量虚假唤醒(条件变量虚假唤醒是如何造成的)



 

        这段代码就是写了一个资源类,这类里面初始化了一个number创建两个方法,一个是检查number是否为0,如果是就可以+1,另一个方法是检查number是否为1如果是就可以-1,相当于一个加一方法,一个减一方法,并且里面都上了锁,是线程安全的,如果在判断里发现条件不符合,那么就会进行wait等待(这个方法特点是如果是等待中,可以被唤醒,但是被唤醒后抢夺锁的成功后,会从wait那行代码执行),直到别的方法被执行后自己重新拿到锁判断符合后继续执行。

        举个例子就相当于,如果最开始创建了这个资源类的对象,然后我开启了两个线程,一个线程循环执行+1的方法,一个线程不断循环执行-1的方法。默认数字number=0,如果被-1方法的线程获取到锁,那么判断当前if(number!=0)此时判断不符合条件,所以此时等待,然后开始不断抢夺锁,直到被+1方法的线程抢夺到锁,此时判断if(number!=1)符合条件,那么执行+1,并且唤醒所有wait中的方法,那么+1方法的线程被唤醒可以抢夺锁,直到+1方法的线程获取到锁之后,+1方法才会继续从wait之后开始执行。结果就是两个线程不断轮询的输出 +1   -1   +1   -1。

问题出现

        假如我现在开辟了4个线程,A和B线程是不断循环执行+1的方法,CD线程是不断循环执行-1的方法。那么此时会出现一个虚假唤醒问题。

        举例:

        有没有发现问题!!!如果判断后进入wait后,如果被唤醒后获取到锁之后,他不会继续判断number数字了,而是从后面直接执行!这就是经典的用if造成的虚假唤醒问题。

        解决方案1:

                在官方API介绍中只需要把while替换if,就可以避免,因为while就算中的wait被唤醒也会循环判断一次的。

到此这篇条件变量虚假唤醒(条件变量虚假唤醒是如何造成的)的文章就介绍到这了,更多相关内容请继续浏览下面的相关 推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • 论文右上角小圈1怎么打(论文右上角标怎么弄)2025-03-21 08:36:09
  • 程序员入门(程序员入门要学什么)2025-03-21 08:36:09
  • 简单密码库(密码库查询)2025-03-21 08:36:09
  • yml文件没有提示(.yml文件)2025-03-21 08:36:09
  • k8s不停机更新(k8s 更新pod)2025-03-21 08:36:09
  • 免费海报制作模板图片(海报制作模板图片简单又漂亮跳蚤市场)2025-03-21 08:36:09
  • ubuntu源码在哪里(ubuntu系统源)2025-03-21 08:36:09
  • 原位癌基底膜是什么(原位癌和基底细胞癌癌的区别)2025-03-21 08:36:09
  • linux操作系统怎么学(linux操作系统学了有什么用)2025-03-21 08:36:09
  • ubuntu镜像iso下载(ubuntu2004镜像iso下载)2025-03-21 08:36:09
  • 全屏图片