死锁
死锁
定义:死锁是两个或两个以上的线程互相都持有对方所需要的资源,导致这些线程都处于等待状态。
死锁产生的条件:
- 互斥条件:一个资源只能被一个进程占用。
- 请求和保持条件:一个进程因请求被占用资源而发生阻塞时,对已获得的资源保持不变。
- 不剥夺条件:任何一个资源在没被该进程释放之前,其他线程都无法对他剥夺占用。
- 循环等待:当发生死锁时,所等待的线程会进入一个类似死循环,造成阻塞。
如何避免
- 设置加锁顺序。当多个线程需要一些相同的锁时,按照不同的加锁顺序去加锁。这种需要你事先知道所有的锁,但某些情况是未知的。
- 设置加锁时限。当一个线程在制定时限内没有获取到所需要的锁,则会释放已经获取到的锁,然后等待一段时间再重试。
死锁检查
方式一:jps+jstack
- 运行
jps
,查看当前所有java进程的pid jstack pid
查看当前进程的堆栈状态,如果有死锁会打印出来found 1 deadLock
- 运行
方式二:jvisualvm
代码运行起来后,启动jvisualvm,在线程页面会直接有一个红色的显示:监测到死锁
死锁
http://example.com/死锁/