标签:int out info jstack 查询 没有 bsp 状态 争夺
一 .概述
死锁是一种状态:
多个线程争夺多个锁,如果控制不当,每个线程都获得一部分锁而无法获取所有的全部的锁,此时就会发生死锁.
在一般状态下,死锁在没有外界的干预下会一直陷入到等待当中,也就是说,程序根本无法运行下去.
二 . 死锁
死锁的状态是我们不想看见的,但是当我们遇到的时候我们需要进行诊断,明白到底哪里出现了死锁.
例子:
public class DaedLock { private static Object lock1 = new Object(); private static Object lock2 = new Object(); public static void requireLock1() { synchronized (lock1) { System.out.println(Thread.currentThread().getName()+"获得了lock1"); synchronized (lock2) { System.out.println(Thread.currentThread().getName()+"获得了lock2"); System.out.println(Thread.currentThread().getName()+"获得了全部的锁,可以运行了"); System.out.println("-----------------------"); } } } public static void requireLock2() { synchronized (lock2) { System.out.println(Thread.currentThread().getName()+"获得了lock2"); synchronized (lock1) { System.out.println(Thread.currentThread().getName()+"获得了lock1"); System.out.println(Thread.currentThread().getName()+"获得了全部的锁,可以运行了"); System.out.println("-----------------------"); } } } public static void main(String[] args) { new Thread(new Runnable() { public void run() { for(;;) requireLock1(); } }).start(); new Thread(new Runnable() { public void run() { for(;;) requireLock2(); } }).start(); } }
我们创建了两个锁.有两个方法运行时需要这两个锁,但是获取锁的顺序不一致.
当运行上述的代码时,我们会发现一会就会出现没有打印输出的时刻,这就是程序陷入了死锁的状态.
结果如下:
此时,两个线程分别获取了一把锁,但是无法获取对方的锁.这个时候双方互相等待,就出现了死锁.
三 .通过工具了解死锁
首先查看所有的进程
然后使用jstack 进程号
我们看到了一个死锁的信息,这样就能方便我们查询死锁的源头.
标签:int out info jstack 查询 没有 bsp 状态 争夺
原文地址:https://www.cnblogs.com/trekxu/p/8970991.html