• 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)、产生死锁的代码行数 等信息

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

  • 相关阅读:
    在jenkins中新建节点,启动方式中没有“通过java web启动”
    在jenkins上执行web自动化脚本出现cannot find Chrome binary
    修改禅道的默认端口
    jmeter修改字体大小
    电脑中安装了两个版本的jdk,后装的会把第一个覆盖掉
    各种浏览器的驱动
    js中的null和undefined总结
    关于 es6的 let 特性在 for 循环结构 的个人理解
    ajax五,jsonp跨域的本质
    ajax四,封装ajax并优化
  • 原文地址:https://www.cnblogs.com/feshfans/p/11297947.html
Copyright © 2020-2023  润新知