死锁
线程1等待线程2互斥持有的资源,而线程2也在等待线程1互斥持有的资源,两个线程都无法继续执行。
活锁
线程持续重试一个总是失败的操作,导致无法继续执行。
饿死
线程一直被调度延迟访问其赖以执行的资源,也许是调度器先于低优先级的线程而执行高优先级的线程,同时总是会有一个高优先级的线程可以执行,饿死也叫作无限延迟。
死锁实例
1 | public class MyTest6 { |
输出:
method2 invoked
method1 invoked
死锁检测
jvisualvm
这个时候我们使用jvisualvm查看死锁,在cmd里边敲入jvisualvm
myThread2持有0x000000076f1a8300,等待0x000000076f1a82f0;
myThread1持有0x000000076f1a82f0,等待0x000000076f1a8300;
死锁产生。
下边也有死锁的信息打印:
1 | Found one Java-level deadlock: |
jstack命令
首先使用jstack查看当前的java进程:
1 | C:\Users\Administrator>jps |
我们死锁程序是MyTest6,接下来使用jstack查看:
1 | jstack 21352 |
显示的结果和jvisualvm打印的是一致的。