线程——死锁

基本介绍

多个线程都占用了对方的锁资源,但不肯相让,导致了死锁,在编程是一定要避免死锁的发生。

例:
妈妈:你先完成作业,才让你玩手机
小明:你先让我玩手机,我才完成作业

模拟线程死锁



package thread_;

/**
 * @Author: Gin
 * @Description:
 * @Modified By: Gin
 * @Date: Created in 17:07 2021/9/27
 */
public class DeadLock_ {
    public static void main(String[] args) {

        // 模拟死锁现象
        DeadLockDemo A = new DeadLockDemo(true);
        DeadLockDemo B = new DeadLockDemo(false);
        A.start();
        B.start();

    }
}
class DeadLockDemo extends Thread{

    // 保证多个线程共享同一个对象
    static Object o1 = new Object();
    static Object o2 = new Object();
    boolean flag;

    public DeadLockDemo(boolean flag){
        this.flag = flag;
    }

    @Override
    public void run() {
        // 以下业务逻辑分析:
        // 假设有两条线程 A, B ,分别传入参数 true, false
        // 1. flag 为 true,线程 A 就会先得到 o1 对象锁,然后尝试去获取 o2 对象锁
        // 2. 如果线程 A 得不到 o2 对象锁,就会被阻塞
        // 3. flag 为 false,线程 B 就会先得到 o2 对象锁,然后尝试去获取 o1 对象锁
        // 4. 如果线程 B 得不到 o1 对象锁,就会被阻塞
        if(flag){
            synchronized (o1){
                System.out.println(Thread.currentThread().getName() + " 进入 1 ");
                synchronized (o2){
                    System.out.println(Thread.currentThread().getName() + " 进入 2 ");
                }
            }
        }else{
            synchronized (o2){
                System.out.println(Thread.currentThread().getName() + "进入 3 ");
                synchronized (o1){
                    System.out.println(Thread.currentThread().getName() + " 进入 4 ");
                }
            }
        }
    }
}


在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值