Java多线程死锁的那些事...

死锁是指多个进程在争夺资源中形成的一种互相等待状态,导致无法继续执行。产生死锁的四个必要条件包括:互斥、占有并等待、不可抢占和循环等待。为防止死锁,可以采取措施如避免一个线程同时获取多个锁,或者使用tryLock()避免内部锁。当遇到死锁,可以使用`jps-l`和`jstack`命令进行诊断和定位。
摘要由CSDN通过智能技术生成

什么是死锁?

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

 

产生死锁的条件:

1.相互排斥:当一个线程获得资源后,其他线程必须等待。

2.一旦抢占了资源,就不会主动释放。

3.不可被抢占,获取资源后,不会被抢占。

4.循环等待。

注:打破任一条件,即可破坏死锁。

避免死锁的几个常用方法:

1.避免一个线程同时获取多个锁。

2.避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源。

3.也可以尝试使用lock.tryLock(timeout)来代替使用内部锁机制。

死锁代码示例:

public class DeadLock {
    static  Object A = new Object();
    static Object B = new Object();

    public static void main(String[] args) {
        deadLock();
    }

    public static void deadLock() {
        new Thread(() -> {
            synchronized (A) {
                System.out.println("t1 == A ===");
                synchronized (B) {
                    System.out.println("t1 == B ===");
                }
            }
        },"t1").start();

        new Thread(() -> {
            synchronized (B) {
                System.out.println("t2 == A ===");
                synchronized (A) {
                    System.out.println("t2 == B ===");
                }
            }
        },"t2").start();
    }

}

死锁定位分析:

1.通过 " jps -l "命令定位进程号

 2.通过 " jstack + 进程号 " 命令找到死锁详细信息。

        例: jstack 52380

        

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值