zoukankan      html  css  js  c++  java
  • 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)、产生死锁的代码行数 等信息

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

  • 相关阅读:
    办公自动化12-word批量替换(将替换内容写在excel里)
    办公自动化11-把word里所有的分节符替换为分页符
    办公自动化10-合并多个word文件
    办公自动化9-批量word转pdf
    办公自动化8-单个pdf转txt
    python3安装docx模块出现Import Error: No module named 'exceptions'
    办公自动化7-Rename批量修改文件名称(实现自动编号)
    办公自动化6-OS库基本操作
    线性空间
    二重积分
  • 原文地址:https://www.cnblogs.com/feshfans/p/11297947.html
Copyright © 2011-2022 走看看