1.什么是死锁
所谓死锁是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵局状态时,若无外力作用,它们都将无法再向前推进。
例:如果有个线程a,按照先锁a再锁b的顺序获取得锁,在此同时又有另一个线程b,按照先锁b再锁a的顺序获取锁。
2.产生死锁的原因
1.系统资源不足;
2.进程推进顺序不合适;
3.资源分配不当;
3.死锁产生的必要条件
- 互斥使用:即当资源被一个线程使用(占有)时,别的线程不能使用
- 不可抢占:资源的请求者不能强制从资源的占有者手中获取资源,资源只能由占有者主动释放
- 请求和保持:资源的请求者在请求其他资源的同时保持对原有资源的占有
- 循环等待:即存在一个等待队列:P1占有P2的资源,P2占有P3的资源,P3占有P1的资源。这样就形成了一个等待环路
4.解决死锁的办法
- 加锁顺序:能确保所有的线程都是按照相同的顺序获得锁,那么死锁就不会发生
- 加锁时限:线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁
- 死锁检测:JConsole工具对运行的资源和性能进行监控
5.代码角度:
一种是用synchronized,一种是用Lock显式锁实现