码迷,mamicode.com
首页 > 其他好文 > 详细

009 死锁

时间:2018-04-29 15:24:15      阅读:179      评论:0      收藏:0      [点我收藏+]

标签: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 进程号

  技术分享图片

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

 

009 死锁

标签:int   out   info   jstack   查询   没有   bsp   状态   争夺   

原文地址:https://www.cnblogs.com/trekxu/p/8970991.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!