美文网首页
Java DeadLock 演示与排查

Java DeadLock 演示与排查

作者: perseverance_li | 来源:发表于2020-06-11 16:38 被阅读0次

    什么是死锁

    死锁是指两个或者两个以上的线程在执行过程中,因为争夺资源而造成的一种相互等待的现象,若无外力干涉,那它们都将无法推进下去。


    DeadLock

    代码举例

    public class DeadLockDemo {
    
        public static void main(String[] args) {
            String la = "lock-a";
            String lb = "lock-b";
    
            new Thread(new HoldLock(la, lb), "T-A").start();
            new Thread(new HoldLock(lb, la), "T-B").start();
        }
    
    }
    
    class HoldLock implements Runnable {
    
        private String lockA;
        private String lockB;
    
        public HoldLock(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 {
                    Thread.sleep(2000l);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (lockB) {
                    System.out.println(Thread.currentThread().getName() + " -- 持有锁: " + lockB + " 尝试获取: " + lockA);
                }
            }
        }
    }
    
    进程卡死

    死锁排查

    获取怀疑产生死锁的进程id

    使用jps命令获取
    jps
    使用ps命令获取
    ps

    打印死锁堆栈信息

    使用jdk自带的jstack命令获取堆栈信息

    jstack 6911
    
    jstack

    相关文章

      网友评论

          本文标题:Java DeadLock 演示与排查

          本文链接:https://www.haomeiwen.com/subject/qqnbtktx.html