notifyAll()应该写在什么位置

notifyAll()应该写在什么位置

老师 这个地方不太懂


我们应该在线程死锁的时候 用notifyAll()方法来唤醒线程


那我们如何判断代码运行在什么位置的时候发生了线程死锁呢


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

视频中把notifyAll()加到这里 ,我不懂为什么是写在这里的

如果两个线程都在wait()中等待 那么它页无法执行到notifyAll()这个语句啊?

还是执行完wait()这条语句后,线程虽然变成等待状态了,但是程序可以继续往下执行?

如果把notifyAll()加到wait()后面可以吗


正在回答 回答被采纳积分+1

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

1回答
好帮手慕阿慧 2020-12-22 18:27:33

同学你好,

1、什么时候发生死锁要结合具体的代码。关于死锁,同学可以参考另一个问答 https://class.imooc.com/course/qadetail/270516

2、flag属于公共资源,同一个时刻只能有一个线程对flag的进行访问,修改他的值。

如果两个线程都在wait()中等待 ,这时就是死锁。线程变成等待状态后,程序不可以继续往下执行,只有被唤醒后,才能继续往下执行。

应该在使用完资源flag后,再调用notifyAll()唤醒其他线程。不可以把notifyAll()加到wait()后面。

  • 提问者 一娆Hacker #1

    老师你回答的不是我想问的

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

    程序既然不能往下执行 ,那notifyAll()这个语句在wait()后面,这条语句是怎么执行的呢?不能执行的到,线程又是怎么被唤醒的?所以我对这个notifyAll()的位置有疑惑

    2020-12-22 18:48:17
  • 好帮手慕阿慧 回复 提问者 一娆Hacker #2

    同学你好,

    1、如果两个线程都在wait()中等待,那么这是程序的一个bug错误,表示我们的程序是有问题的,这时需要我们修改代码。在程序没有错误的情况下,不会出现两个线程都在等待的情况。

    2、课程中的执行是这样的:

     (1)假设目前flag=flase,此时get方法处于等待状态,set方法是可以被执行的。

     (2)当set方法执行完毕后修改flag值为true,调用notifyAll来释放锁。

     (3)这时flag=true,此时set方法处于等待状态,get方法是可以被执行的。

    祝学习愉快~

    2020-12-22 19:02:32
  • 提问者 一娆Hacker 回复 好帮手慕阿慧 #3

    哦哦 这次懂了

    2020-12-22 19:38:48
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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