死锁

本文深入探讨了死锁这一多线程编程中常见的问题,详细解释了死锁产生的原因及条件,通过具体示例代码展示了线程如何因争夺锁资源而陷入无限等待的状态,强调了预防死锁的重要性。
1. 什么是死锁

两个线程,两个锁对象
线程A获取锁对象1,线程B获取锁对象2,
线程A还需要锁对象2,才能执行
线程B还需要锁对象1,才能执行
线程A和B就相互等待对象释放锁对象,这种情况称为死锁!

public class DeadLockDemo {
public static void main(String[] args) {
//1.两个锁对象
Object obj1 = new Object();
Object obj2 = new Object();
//2.两个线程
//线程A
new Thread(new Runnable() {
@Override
public void run() {
//3.需要反向嵌套获取锁对象
synchronized (obj1) {
System.out.println(“线程A获取锁对象1,还需要获取锁对象2…”);
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj2) {
System.out.println(“线程A的任务执行了…”);
}
}
}
}).start();

    //线程B
    new Thread(new Runnable() {
        @Override
        public void run() {
            //3.需要反向嵌套获取锁对象
            synchronized (obj2) {
                System.out.println("线程B获取锁对象2,还需要获取锁对象1....");
                try {
                    Thread.sleep(20);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (obj1) {
                    System.out.println("线程B的任务执行了...");
                }
            }
        }
    }).start();

}

}
注意:死锁只能进行避免,一旦出现死锁无法解决!!

2. 产生死锁的条件

a.至少有两个线程
b.至少有两个锁对象
c.需要反向嵌套获取锁对象

3. 死锁演示
public class DeadLockDemo {
    public static void main(String[] args) {
        //1.两个锁对象
        Object obj1 = new Object();
        Object obj2 = new Object();
        //2.两个线程
        //线程A
        new Thread(new Runnable() {
            @Override
            public void run() {
                //3.需要反向嵌套获取锁对象
                synchronized (obj1) {
                    System.out.println("线程A获取锁对象1,还需要获取锁对象2....");
                    try {
                        Thread.sleep(20);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (obj2) {
                        System.out.println("线程A的任务执行了...");
                    }
                }
            }
        }).start();

        //线程B
        new Thread(new Runnable() {
            @Override
            public void run() {
                //3.需要反向嵌套获取锁对象
                synchronized (obj2) {
                    System.out.println("线程B获取锁对象2,还需要获取锁对象1....");
                    try {
                        Thread.sleep(20);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (obj1) {
                        System.out.println("线程B的任务执行了...");
                    }
                }
            }
        }).start();

    }
}

注意:死锁只能进行避免,一旦出现死锁无法解决!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lemon20120331

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值