正在回答
同学你好,
1、get是怎么进入等待状态的呢?
get以为set未生产,所以才处于等待状态。
2、老师代码中死锁是占用的什么资源?
这里的资源指的就是queue。
如果我的回答解决了你的疑惑,请采纳,祝学习愉快~
同学你好,
1、这样理解也是可以的,同学也可以按照楼上同学的第一问来参考理解。当set进入等待状态,也就是生产者线程进入等待状态,这时flag是true,执行get方法。但是这时get方法中消费者线程也处于等待状态,那么消费者线程无法消费,此时就会产生死锁。所以需要使用调用notifyAll来释放锁。
2、死锁有四个必要条件,请讲一下老师代码中死锁问题的具体情况,比如什么资源被占用了等?
结合以下代码来看:
首先死锁的有四个必要条件。
1、互斥使用:lockA和lockB都是独一份的,只能被一个线程使用
2、不可抢占:假如put先抢到了,它使用着lockA呢,他需要lockB,但是put2里,lockB又在等着lockA,但put2方法里的lockB又不能去put里抢占lockA,只能等它用完自己放回去它才能用
3、请求和保持:即当资源请求者在请求其他的资源的同时保持对原有资源的占有。也就是put中的lockA在等待lockB(请求其他的资源),但是,同时又持有这lockA(原有资源的占用)
4、循环等待:他们相互循环调用,互相等待着lockA等着要使用lockB这个资源,但lockB资源中等着用lockA,然后就成了死循环
如果我的回答解决了你的疑惑,请采纳,祝学习愉快~
1、你可以这么理解的,当set进入等待状态,也就是生产者线程进入等待状态,这时flag是true,执行get方法。但是这时get方法中消费者线程也处于等待状态,那么消费者线程无法消费,此时就会产生死锁。所以需要使用调用notifyAll来释放锁。
2、产生死锁的四个必要条件
1、互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用
2、不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。
3、请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占有。
4、循环等待,即存在一个等待队列:P1占有P2的资源,P2占有P3的资源,P3占有P1的资源。这样就形成了一个等待环路。
当这四个条件都满足的时候,就会产生死锁,希望能帮助到你,望采纳
- 参与学习 人
- 提交作业 3802 份
- 解答问题 11489 个
本阶段带你迈入Java世界,学习Java必备基础知识,基础语法、面向对象思想以及常用工具类的使用。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星