一、场景
启动两个线程,线程T1先对资源R1加锁,然后立马对资源R2申请加锁;线程T2先对资源R2加锁,然后立马对资源R1申请加锁。此时线程T1因为T2已经对资源R2加锁,所以一直等待释放R2;T2则一直等待T1释放R1,造成相互等待对方释放锁资源而造成的死锁。
二、案例代码
1、线程T1
2、线程T2
三、检测诊断
1、查询java进程
jps -l
2、查看线程栈信息,并导出
# 查看
jstack 7281
# 导出到文件
jstack 7281 > /tmp/7281.bin
7281为进程号
3、打开线程栈信息,查找死锁标识
可以搜索自己的包名,也可以搜索deadlock
可以明显看到死锁发生在DeadLockController.java的84行和58行代码处
特别感谢参考:https://www.ixigua.com/6842644783408611851?id=6842502368282542596&logTag=0d2f7511c602bc4f1005