目录
死锁:并发下线程因为互相等待对方资源,导致的阻塞现象
产生死锁的四大因素
1.互斥:共享资源只能被一个线程占用(互斥锁)
2.占有且等待:线程当前占有至少一个资源并还想请求其他线程持有的其他资源就会造成等待(等待对方释放资源)
3.不可抢占:资源只能由持有他的线程自愿释放,其他线程不可强行占有该资源(无法释放对方资源)
4.循环等待:线程t1等待线程t2占有的资源,线程t2等待线程t1占有的资源,就是循环等待(两个线程相互等待)
解决死锁
当出现死锁的时候,会同时满足上述四大因素。若想杜绝死锁的产生,破坏其中任意一个条件即可。
1.不使用互斥锁
2.将两个资源放入一个容器,当由进程使用其中的资源时,另一个进程会循环等待。
3.lock锁超时机制,超时后自动释放资源
4.对资源进行标记,有序的去锁资源。
杜绝死锁是设法至少破坏产生死锁的四个必要条件之一,严格的防止死锁的出现,而避免死锁则不那么严格的限制产生死锁的必要条件的存在,因为即使死锁的必要条件存在,也不一定发生死锁。死锁避免是在系统运行过程中注意避免死锁的最终发生。
在实际开发中,很少完全杜绝死锁的发生(影响性能),都会尽量的去避免死锁的发生。
使用银行家算法能有有效的避免死锁的产生,并且系统的吞吐量性能也能得到一定的保障
快速定位产生死锁的进程
1.打开命令行窗口
2.查找当前程序的进程id
3. 通过命令 jstack+进程id 打印出正在死锁的进程
4.回车后找到了一个死锁,并把死锁的进程栈展示出来
5.读取进程栈的信息:t2等待的资源被t1锁住,t1等待的资源被t2锁住。产生死锁