java死锁问题排查

2018-05-11  本文已影响0人  别赶路_去感受路

首先熟悉一下jstack命令的用法,主要参数有-F -l -m 如下图:

jstack

模拟一段死锁的java代码,如下:

```java

@Slf4j

public class DeadLockMockerimplements Runnable {

/**

* 标识

* flag = 1 , 占用资源L1去获取L2

* flag = 0 , 占用资源L2去获取L1

*/

    public boolean flag =false;

    /**

* 声明两个资源对象用来获取资源锁

*/

    public static ObjectL1 =new Object();

    public static ObjectL2 =new Object();

    public static void mock() {

DeadLockMocker deadLock1 =new DeadLockMocker();

        DeadLockMocker deadLock2 =new DeadLockMocker();

        deadLock1.flag =true;

        deadLock2.flag =false;

        Thread thread1 =new Thread(deadLock1);

        Thread thread2 =new Thread(deadLock2);

        thread1.start();

        thread2.start();

    }

@Override

    public void run() {

log.info("flag: {}", flag);

        // deadLock2占用资源o1,准备获取资源o2

        if (flag) {

log.info("准备获取到资源 L1");

            synchronized (L1) {

log.info("获取到资源 L1");

                try {

Thread.sleep(1000);

                }catch (InterruptedException e) {

e.printStackTrace();

                }

log.info("准备获取到资源 L2");

                synchronized (L2) {

log.info("获取到资源 L2");

                }

}

}

// deadLock1占用资源o2,准备获取资源o1

        else if (!flag) {

log.info("准备获取到资源 L2");

            synchronized (L2) {

log.info("获取到资源 L2");

                try {

Thread.sleep(1000);

                }catch (InterruptedException e) {

e.printStackTrace();

                }

log.info("准备获取到资源 L1");

                synchronized (L1) {

log.info("获取到资源 L1");

                }

}

}

}

}

```

执行java程序,通过jstack找到死锁的线程和代码信息

上一篇 下一篇

猜你喜欢

热点阅读