这段代码就是写了一个资源类,这类里面初始化了一个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被唤醒也会循环判断一次的。
到此这篇条件变量虚假唤醒(条件变量虚假唤醒是如何造成的)的文章就介绍到这了,更多相关内容请继续浏览下面的相关 推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/bcyy/33011.html