zoukankan      html  css  js  c++  java
  • 死锁编码及定位分析

    死锁编码及定位分析

    概念

    死锁是指两个或多个以上的进程在执行过程中,因争夺资源而造成一种互相等待的现象,若无外力干涉那他们都将无法推进下去,如果资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁

    产生死锁的原因

    • 系统资源不足
    • 进程运行推进的顺序不对
    • 资源分配不当

    死锁代码

    我们创建了一个资源类,然后让两个线程分别持有自己的锁,同时在尝试获取别人的,就会出现死锁现象

    /**
     * 死锁小Demo
     * 死锁是指两个或多个以上的进程在执行过程中,
     * 因争夺资源而造成一种互相等待的现象,
     * 若无外力干涉那他们都将无法推进下去
     */
    
    import java.util.concurrent.TimeUnit;
    
    /**
     * 资源类
     */
    class HoldLockThread implements Runnable{
    
        private String lockA;
        private String lockB;
    
        // 持有自己的锁,还想得到别人的锁
    
        public HoldLockThread(String lockA, String lockB) {
            this.lockA = lockA;
            this.lockB = lockB;
        }
    
    
        @Override
        public void run() {
            synchronized (lockA) {
                System.out.println(Thread.currentThread().getName() + "	 自己持有" + lockA + "	 尝试获取:" + lockB);
    
                try {
                    TimeUnit.SECONDS.sleep(2);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
    
                synchronized (lockB) {
                    System.out.println(Thread.currentThread().getName() + "	 自己持有" + lockB + "	 尝试获取:" + lockA);
                }
            }
        }
    }
    public class DeadLockDemo {
        public static void main(String[] args) {
            String lockA = "lockA";
            String lockB = "lockB";
    
            new Thread(new HoldLockThread(lockA, lockB), "t1").start();
    
            new Thread(new HoldLockThread(lockB, lockA), "t2").start();
        }
    }
    

    运行结果,main线程无法结束

    t1	 自己持有lockA	 尝试获取:lockB
    t2	 自己持有lockB	 尝试获取:lockA
    

    如何排查死锁

    当我们出现死锁的时候,首先需要使用jps命令查看运行的程序

    jps -l
    

    我们能看到DeadLockDemo这个类,一直在运行

    在使用jstack查看堆栈信息

    jstack  7560   # 后面参数是 jps输出的该类的pid
    

    得到的结果

    Found one Java-level deadlock:
    =============================
    "t2":
      waiting to lock monitor 0x000000001cfc0de8 (object 0x000000076b696e80, a java.lang.String),
      which is held by "t1"
    "t1":
      waiting to lock monitor 0x000000001cfc3728 (object 0x000000076b696eb8, a java.lang.String),
      which is held by "t2"
    
    Java stack information for the threads listed above:
    ===================================================
    "t2":
            at com.moxi.interview.study.Lock.HoldLockThread.run(DeadLockDemo.java:42)
            - waiting to lock <0x000000076b696e80> (a java.lang.String)
            - locked <0x000000076b696eb8> (a java.lang.String)
            at java.lang.Thread.run(Thread.java:745)
    "t1":
            at com.moxi.interview.study.Lock.HoldLockThread.run(DeadLockDemo.java:42)
            - waiting to lock <0x000000076b696eb8> (a java.lang.String)
            - locked <0x000000076b696e80> (a java.lang.String)
            at java.lang.Thread.run(Thread.java:745)
    
    Found 1 deadlock.
    

    通过查看最后一行,我们看到 Found 1 deadlock,即存在一个死锁

  • 相关阅读:
    centos7.6 安装与配置 MongoDB yum方式
    MongoDB 介绍
    centos 关闭selinux
    前端 HTML标签属性
    前端 HTML 标签嵌套规则
    前端 HTML 标签分类
    前端 HTML body标签相关内容 常用标签 表单标签 form里面的 input标签介绍
    前端 HTML body标签相关内容 常用标签 表单标签 form 表单控件分类
    前端 HTML form表单标签 select标签 option 下拉框
    POJ 1426
  • 原文地址:https://www.cnblogs.com/bbgs-xc/p/12831323.html
Copyright © 2011-2022 走看看