synchronized 的虚假唤醒

您所在的位置:网站首页 线程的虚假唤醒 synchronized 的虚假唤醒

synchronized 的虚假唤醒

2024-07-16 02:02| 来源: 网络整理| 查看: 265

问题出现原因

if(num == 0){ //此处会出现【虚假唤醒】 this.wait() }

解决

while(num == 0){ this.wait() }

原因: 拿两个加法线程A、B来说,比如A先执行,执行时调用了wait方法,那它会等待,此时会释放锁,那么线程B获得锁并且也会执行wait方法,两个加线程一起等待被唤醒。此时减线程中的某一个线程执行完毕并且唤醒了这俩加线程,那么这俩加线程不会一起执行,其中A获取了锁并且加1,执行完毕之后B再执行。如果是if的话,那么A修改完num后,B不会再去判断num的值,直接会给num+1。如果是while的话,A执行完之后,B还会去判断num的值,因此就不会执行。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3