009 死锁

一 .概述

  死锁是一种状态:

    多个线程争夺多个锁,如果控制不当,每个线程都获得一部分锁而无法获取所有的全部的锁,此时就会发生死锁.

  在一般状态下,死锁在没有外界的干预下会一直陷入到等待当中,也就是说,程序根本无法运行下去.


二 . 死锁

  死锁的状态是我们不想看见的,但是当我们遇到的时候我们需要进行诊断,明白到底哪里出现了死锁.

例子: 

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 进程号

  

我们看到了一个死锁的信息,这样就能方便我们查询死锁的源头.

猜你喜欢

转载自www.cnblogs.com/trekxu/p/8970991.html
009
今日推荐