手写死锁及死锁排查

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

手写死锁及死锁排查

产生死锁的原因

系统资源不足

进程运行推进的顺序不对

资源分配不当

死锁产生的四个必要条件

互斥

解决方法:把互斥的共享资源封装成可同时访问

占有且等待

解决方法:进程请求资源时,要求它不占有任何其它资源,也就是它必须一次性申请到所有的资源,这种方式会导致资源效率低。

非抢占式

解决方法:如果进程不能立即分配资源,要求它不占有任何其他资源,也就是只能够同时获得所有需要资源时,才执行分配操作

循环等待

解决方法:对资源进行排序,要求进程按顺序请求资源。

2、死锁代码

public class DeadLock {
    public static void main(String[] args) {
        Resource666 res1 = new Resource666();
        Resource666 res2 = new Resource666();
        res1.flag = true;
        res2.flag = false;
        new Thread(new Runnable() {
            @Override
            public void run() {
                res1.method();
            }
        }, "A").start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                res2.method();
            }
        },"B").start();
    }
}

class Resource666 {
    boolean flag = true;
    private static final Object obj1 = new Object();
    private static final Object obj2 = new Object();

    public void method() {
        if (flag) {
            synchronized (obj1) {
                System.out.println(Thread.currentThread().getName() + " " + "获取到锁1");
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (obj2) {
                    System.out.println(Thread.currentThread().getName() + " " + "获取到锁2");
                }
            }
        } else {
            synchronized (obj2) {
                System.out.println(Thread.currentThread().getName() + " " + "获取到锁2");
                synchronized (obj1) {
                    System.out.println(Thread.currentThread().getName() + " " + "获取到锁1");
                }
            }
        }
    }
}

复制代码

3、如何排查死锁

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

手写死锁及死锁排查

在使用jstack查看堆栈信息

jstack  5116  # 后面参数是 jps输出的该类的pid
复制代码

得到的结果

手写死锁及死锁排查

原文 

https://juejin.im/post/5f1ba2025188252e8e654478

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » 手写死锁及死锁排查

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址