发生死锁的原因
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都处于等待状态
我感觉不可能
get和set都加了锁定 页就是get要执行完毕 才能执行set线程
或者set执行完毕才能执行get线程
线程中的flag是交替变化的,所以想不明白到底是怎么造成死锁的
老师能帮忙详细模拟一下这个过程吗
36
收起
正在回答 回答被采纳积分+1
1回答
好帮手慕小脸
2020-12-22 18:08:08
同学你好,两个线程抢占资源是随机的,也就是说课程中线程执行get()方法和set()方法也是随机,不确定的。并不是同学所理解的固定交替变化
这里是当set进入等待状态,也就是生产者线程进入等待状态,这时flag是true,执行get方法。但是这时get方法中消费者线程也处于等待状态,那么消费者线程无法消费,此时就会产生死锁。所以需要使用调用notifyAll来释放锁,简单理解:
这里两个线程在执行过程中,这时当前线程为false,而另一个线程可能flag还没执行到为true时,但是同一时间都想要争夺CPU资源来进行生产和消费,就造成的一种互相等待的现象(即死锁),若无外力作用,它们都将无法推进下去。
祝学习愉快~
java工程师2020版
- 参与学习 人
- 提交作业 9393 份
- 解答问题 16556 个
综合就业常年第一,编程排行常年霸榜,无需脱产即可学习,北上广深月薪过万 无论你是未就业的学生还是想转行的在职人员,不需要基础,只要你有梦想,想高薪
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星