1. 描述

    两个进程独占性的访问某个资源,从而等待另外一个资源的执行结果,会导致两个进程都被阻塞,并且两个进程都不会释放各自的资源,这种情况就是 死锁(deadlock),总之吃着碗里的看着锅里的容易死锁

    1. 产生原因
    • 互斥条件:资源具有排他性,只能被一个线程占用
    • 持有并请求条件:线程已经持有了资源,但还在请求其它资源
    • 不可剥夺条件:当线程已经持有了资源 ,在未使用完之前,不能被剥夺
    • 环路等待条件: 在死锁发生的时候,两个线程获取资源的顺序构成了环形链

    image.png

    1. 死锁排查
    • jstack:可以根据日志输出来直接定位到具体的死锁代码
    • jmc:需要选择死锁类,右键启动JMX控制台,然后就可以发现死锁和死锁具体信息
    1. 避免死锁
    • 固定加锁顺序:通过有顺序的获取锁,从而避免产生环路等待条件,从而解决死锁问题的
    • 开放调用避免死锁:就是不加锁
    • 使用定时锁:使用显式Lock锁,在获取锁时使用tryLock()方法。当等待超过时限的时候,tryLock()不会一直等待,而是返回错误信息,能够有效避免死锁问题
    1. 总结
    • 死锁问题的产生是由两个或者以上线程并行执行的时候,争夺资源而互相等待造成的。
    • 死锁只有同时满足互斥、持有并等待、不可剥夺、环路等待这四个条件的时候才会发生。
    • 所以要避免死锁问题,就是要破坏其中一个条件即可,最常用的方法就是使用资源有序分配法来破坏环路等待条件。