老师视频里说的死锁

老师视频里说的死锁

为什么会造成死锁呢,明明加了synchronized同步了,也flag=true或是flag=false,程序如果按这个逻辑(视频里没加notify之前)执行不应该会出现死锁呀,我搞不懂


正在回答

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

2回答

你好同学,如下图所示,可以看出线程的执行顺序是随机的,死锁是可能出现的问题,我将线程的执行顺序用可视化的文字打印出来了,如下是我将notifyAll方法注释掉的演示效果,可以看出在执行的过程中,会执行两次消费的代码,所以造成了消费的代码的if语句成立执行了wait方法,因为flag的值发生改变,生产者线程也进入了等待状态,所以建议同学在解决这类问题时,添加notify方法,避免发生死锁的问题

http://img1.sycdn.imooc.com//climg/5c3599a400013fcd02670411.jpg

好帮手慕珊 2019-01-08 18:50:23

你好!虽然有同步,但是这里有wait()进行等待,线程处于等待状态,这时候其他线程是可以执行的。如果两个线程都等待了,而不去用notify()唤醒,就会发生死锁。祝学习愉快!

  • 提问者 努力学习的我 #1
    但是flag不是没有重置吗,比如flag是false,队列里没有东西,消费线程wait,生产线程不是应该执行i++吗,为什么会出现生产线程也等待了呢,它是执行了flag=true了?不应该呀,还是说因为某种原因被打断了 ,我是不太懂为什么另一个也变成了等待,按逻辑是不应该两个都等待的,死锁的原因我懂
    2019-01-08 20:06:46
  • chrismorgen 回复 提问者 努力学习的我 #2
    你好!你的意思是将set方法中的notifyAll()方法注释掉了吗?如果是,生产线程就会等待的,因为生产和消费,是互相唤醒的,如果你将notifyall()方法注释掉了,这两个线程都会进入等待状态,就会发生死锁,如果同学还是有什么疑问,建议你将代码粘贴到我要回答中,并指出哪里不明白,这样能帮助老师更好的理解你的问题,并具有针对性的为你解答,祝学习愉快~
    2019-01-09 10:26:10
  • 提问者 努力学习的我 #3
    就是视频里不是出现了生产到13就发现死锁了嘛,我想知道为什么,按照代码的逻辑(没加notifyAll之前)不应该发生死锁啊
    2019-01-09 11:41:20
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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