发生死锁的原因

发生死锁的原因

package com.lding.queue;

public class Queue {
private int n;
boolean flag=false;
public synchronized int getN() {
if(!flag){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("消费:" + n);
flag=false;//消费完毕 容器中无数据
notifyAll();
return n;
}

public synchronized void setN(int n) {
if(flag){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("生产:"+n);
this.n = n;
flag=true;//生 产完毕 容器中有数据
notifyAll();

}
}

老师 这段代码如果没有加notifyAlll()唤醒代码,他究竟是怎么产生线程死锁的/?


视频中根本没有讲,老师只讲了 这时候发生死锁 因为get和set都处于等待状态


我感觉不可能


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


get和set都加了锁定 页就是get要执行完毕 才能执行set线程

或者set执行完毕才能执行get线程


线程中的flag是交替变化的,所以想不明白到底是怎么造成死锁的


老师能帮忙详细模拟一下这个过程吗

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

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

1回答
好帮手慕小脸 2020-12-22 18:08:08

同学你好,两个线程抢占资源是随机的,也就是说课程中线程执行get()方法和set()方法也是随机,不确定的。并不是同学所理解的固定交替变化

这里是当set进入等待状态,也就是生产者线程进入等待状态,这时flag是true,执行get方法。但是这时get方法中消费者线程也处于等待状态,那么消费者线程无法消费,此时就会产生死锁。所以需要使用调用notifyAll来释放锁,简单理解:

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

祝学习愉快~

  • 提问者 一娆Hacker #1

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

    2020-12-22 18:31:44
  • 提问者 一娆Hacker #2

    这样理解是正确的吗

    2020-12-22 18:32:07
  • 好帮手慕小脸 回复 提问者 一娆Hacker #3

    同学你好,上述理解是正确的,在执行消费者方法时,消费者消费完毕,此时消费者线程正处于运行状态,生产者线程处于等待阻塞状态,需要执行notifyAll方法来将生产者的线程唤醒,反之亦然。

    如果解决了你的疑惑,请采纳,祝学习愉快~

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

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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