java死锁出现情况及解决办法

173 阅读1分钟

死锁出现的情况:

两个及两个以上的线程出现互相调用对方已上锁资源出现的互相等待的情况

image.png

示例代码:

image.png

流程:

线程1获取锁a,睡眠1秒准备去获取锁b,发现锁b被线程2占用,所以等待线程2释放锁b后执行后续操作;

线程2获取锁b,睡眠1秒准备去获取锁a,发现锁a被线程1占用,所以等待线程1释放锁a后执行后续操作;

通过控制器的输出可以看到两个线程处于死锁状态,所以线程并未结束

image.png

一般实际工作中出现线程未结束的情况可能有其他原因,例如:线程陷入死循环等等...

所以如何鉴别代码陷入了死锁?

jps:

类似linux中的ps -ef

jstack:

jvm自带堆栈跟踪工具

示例代码:

image.png

(由于我没有配置环境变量,所以进入到了jdk的bin目录下执行命令行,如果配置了环境变量可以直接操作)

使用jps -l看到了我的测试类,3508是对应的进程号

执行jstack 3508

image.png

提示发现一个死锁(deadlock)并且提示等待互相释放锁