老师,5-1为什么在synchronized修饰下,使用flag为什么会出现2个方法都wait()

老师,5-1为什么在synchronized修饰下,使用flag为什么会出现2个方法都wait()

本身没理解为什么会出现,在set方法里,flag为true的时候wati,false的情况下,设置flag=!flag,在get方法里,falg为false的时候wait,不是最多一个在等待一个在执行,有点不懂。

我这边eclipse运行的时候等了很久一直没出现;


在去掉synchronized修饰时,反而会出现 java.lang.IllegalMonitorStateException 异常

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,当第一次flag等于false时,表示没有数据产生,数据为空,此时线程不进入等待,所以执行下面生产数据的代码,进入生产数据,生产完毕,容器中已经有数据, flag设置为true,线程执行进行消费,只有flag判断为ture时,进行消费,线程在前面的过程中可能会出现交换执行(这个是随机的,也可能一开始就被阻塞)

    但这里,两个的线程在执行过程可能会出现,当前线程自己调用了wait()方法进行等待了,会在中途执行另一个线程,这时当前线程为false,而另一个线程可能flag还没执行到为true时,但是同一时间都想要争夺CPU资源来进行生产和消费,就造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去产生死锁。

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

好帮手慕小尤 2020-03-01 18:32:25

同学你好,1. 死锁(出现2个方法都wait())是当set进入等待状态,也就是生产者线程进入等待状态,这时flag是true,执行get方法。但是这时get方法中消费者线程也处于等待状态,没有被唤醒,或者使用notify()方法唤醒的还是生产者线程,那么消费者线程无法消费,就会产生死锁。

2. IllegalMonitorStateException 异常就是因为一个线程压根就没拥有这个对象,却试图去等待线程导致的,解决方法是进行同步,先拿到这个对象,再调用wait()。

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

  • 提问者 橘猫铲屎官 #1
    老师,有点不理解的是,set和get方法都在synchrinized的修饰下,不是只运行执行该个线程方法,那么flag不是只有true和false,在set被wait的情况下,调用get不是一定可以执行,并返回的flag,又能在set运行的时候继续运行?
    2020-03-01 20:55:56
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师