死锁

原因

两个线程试图以不同的顺序来获取相同的锁。

四个必要条件

  • 互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用。

  • 不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。

  • 请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占有。

  • 循环等待,即存在一个等待队列:线程1占有A资源的同时想要获取B资源,而线程2占有B资源的同时想要获取A资源;于是便形成了一个等待队列。

当上述四个条件都成立的时候,便形成死锁。当然,死锁的情况下如果打破上述任何一个条件,便可让死锁消失。

死锁的诊断

JVM工具

jps -l

查看JVM进程

jstack {pid}

查看pid进程的堆栈信息

避免死锁的方法

定时锁

使用Lock类中的定时tryLock功能来代替内置锁。指定一个超时时间,再等待时间超过设置的时间后,返回失败信息或回滚重新尝试获取所有锁;避免永远等待,造成死锁。

Last updated