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

条件变量虚假唤醒(条件变量虚假唤醒是如何造成的)pre pre 这段代码就是写了一个资源类 这类里面初始化了一个 number 创建了两个方法 一个是检查 number 是否为 0 如果是就可以 1 另一个方法是检查 number 是否为 1 如果是就可以 1 相当于一个加一方法 一个减一方法 并且里面都上了锁 是线程安全的 如果在判断里发现条件不符合 那么就会进行 wait 等待 这个方法特点是如果是等待中

大家好,我是讯享网,很高兴认识大家。



 <pre></pre> 

讯享网

        这段代码就是写了一个资源类,这类里面初始化了一个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被唤醒也会循环判断一次的。


小讯
上一篇 2025-05-07 13:52
下一篇 2025-04-14 12:39

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/200362.html