明wait只释放当前的那把锁的问题

来源:7-5 wait解析

慕神3666074

2020-05-15

悟空老师,你好。在讲解wait只释放当前的锁的时候,您使用的代码案例类是WaitNotifyReleaseOwnMonitor 。 thread1中已经使用了wait()释放了锁,并且在thread2中获取到了,并且thread1因为调用了wait()方法,使得thread1一直占用着resourceA这把锁,一直处于等待状态,并且resourceA.wait()是在synchronized(resourceB){} 代码块中,证明thread1线程的一直占用着resourceB这把锁,所以在thread2线程对象中执行不了resourceB中的代码。 我这样理解对吗?

本实例代码,如果我想让代码正常退出,这个代码应该如何改进?我尝试的改进了,就是在thread2的resourceA代码块中使用了resourceA.notify(),但是程序依然退出不了

写回答

1回答

悟空

2020-05-18

你的理解对的。不过有一句话我没看懂:“并且thread1因为调用了wait()方法,使得thread1一直占用着resourceA这把锁”。这里调用wait方法是会释放锁的。

关于程序退出:只唤醒A是不够的,因为唤醒时,线程2还持有锁A,要等线程2释放后,线程1才能拿到锁并退出,但是线程2没有机会释放,因为线程2想拿锁B,形成死锁。

0
2
悟空
回复
慕神3666074
可以 进课程的QQ群哈 我在里面
2020-05-18
共2条回复

线程八大核心+Java并发原理及企业级并发解决方案

完整的并发知识网络+丰富的工作内容分享+50余道并发高频面试题

2512 学习 · 939 问题

查看课程