java 死锁演示

java 死锁演示

模拟死锁生成

死锁是由多个线程竞争同一个资源导致


package com.feshfans;

/**
 * 1. 本代码为展示 java 中死锁的产生
 * 2. 死锁的排查方法
 */
public class DeadlockShow {

    // 声明两个资源
    private static final String ResourceA = "A";
    private static final String ResourceB = "B";

    private static void deadlock(){

        Thread t1= new Thread(new Runnable() {
            @Override
            public void run() {
                // 线程 A 先获取 ResourceA,即线程A持有 ResourceA 的锁
                synchronized (ResourceA){
                    System.out.println("T1 get resource A");
                    try {
                        // 休眠 2 秒,目的是为了让线程 B 有足够的时间获取 ResourceB
                        // 为什么要用 sleep,因为 sleep 方法不会释放锁对象
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (ResourceB){
                        System.out.println("T1 get resource B");
                    }

                }

            }
        },"Thread-A");

        Thread t2= new Thread(new Runnable() {
            @Override
            public void run() {
                // 线程 B 先获取 ResourceB,即线程 B 持有 ResourceB 的锁
                synchronized (ResourceB){
                    System.out.println("T2 get resource B");
                    try {
                        // 休眠 1 秒,目的是为了让线程 A 有足够的时间获取 ResourceA
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (ResourceA){
                        System.out.println("T1 get resource A");
                    }
                }

            }
        }, "Thread-B");

        // 启动两个线程
        t1.start();
        t2.start();
    }

    public static void main(String[] args) {
        deadlock();
        // 主线程并不会退出,因为 deadlock() 产生的死锁,子线程一直没有执行完
    }
}
死锁查看
  1. 先使用 jps 查看 java 进程的 pid, 如图:

查看 java 进程
查看 java 进程

  1. 使用 jstack 查看 java 栈信息,如图:

    查看死锁信息

从上图中可以清楚的看出死锁的个数、哪几个线程之间产生了死锁、线程之间竞争资源的内存地址和资源类型(本例为 String)、产生死锁的代码行数 等信息

个人建议,大家在开启线程时,为每个线程都赋予一个名字,这样出现问题时,就会特别清楚

posted @ 2019-08-04 13:17  feshfans  阅读(279)  评论(0编辑  收藏  举报