6、传统的生产者,消费者问题和if判断产生的虚假唤醒线程问题

传统的生产者,消费者问题和if判断产生的虚假唤醒线程问题

  1. 传统版(syn版):

案例:线程交替执行(涉及线程通信的问题:(生产者,消费者问题))

其中就是一个线程去通知唤醒,一个线程是等待唤醒

第一步:写资源类(属性和方法记住)

 第二步:每个方法都先等待通知,让后完成操作后再通知操作(生产者消费者问题口诀:

判断等待(判断是否需要等待),业务,通知)

第三步:去线程操作资源类

问题:但是若是不止两个线程我们多加结果线程(if出现(等待循环)虚假唤醒问题)

还出现2了

问题所在:资源类的if判断(等待循环)出现虚假唤醒

场景我们有连个线程执行+1操作的时候,if只判断了一次

Jdk官方文档:(用while去循环等待)

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

猜你喜欢

转载自blog.csdn.net/logtcm4/article/details/127851774