13.死锁编码及定位分析

产生死锁的原因:
    1.系统资源不足
    2.进程进行推进的顺序不合适
    3.资源分配不当

按照图示写个死锁:
    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() {
            //重点2:锁住其中一个去获取另外一个的锁
            synchronized (lockA){
                System.out.println(Thread.currentThread().getName()+"已经持有"+lockA+"  尝试获取"+lockB);
                synchronized (lockB){
                    System.out.println(Thread.currentThread().getName()+"获取到了"+lockB);
                }
            }
        }
    }
    public class DeadLockDemo {
        public static void main(String[] args) {
            //重点3:创建两个线程去分别获取对方的锁,因为此时对方锁可能被占用着,导致死锁
            new Thread(new HoldLockThread("A锁","B锁"),"A线程").start();
            new Thread(new HoldLockThread("B锁","A锁"),"B线程").start();
        }
    }

如何排查死锁问题呢:
    使用:JPS命令(查询进程号)
          jstack (进程号,查看问题所在)  
     得出来的结论:发现是死锁
         "B线程" #12 prio=5 os_prio=0 tid=0x0 00000001b059000 nid=0xae50 waiting for monitor entry [0x000000001bc0f000]
           java.lang.Thread.State: BLOCKED (on object monitor)
                at deadLock.HoldLockThread.run(DeadLockDemo.java:17)
                - waiting to lock <0x00000007818e1038> (a java.lang.String)
                - locked <0x00000007818e1068> (a java.lang.String)
                at java.lang.Thread.run(Thread.java:745)
        
        "A线程" #11 prio=5 os_prio=0 tid=0x000000001b056800 nid=0xe30c waiting for monitor entry [0x000000001bb0e000]
           java.lang.Thread.State: BLOCKED (on object monitor)
                at deadLock.HoldLockThread.run(DeadLockDemo.java:17)
                - waiting to lock <0x00000007818e1068> (a java.lang.String)
                - locked <0x00000007818e1038> (a java.lang.String)
                at java.lang.Thread.run(Thread.java:745)

posted @ 2022-05-19 22:14  努力的达子  阅读(41)  评论(0编辑  收藏  举报