线程死锁理解及代码解释

基本介绍

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

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

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

如果双方一直僵持的话就会形成一个死循环。 这就类似于线程的死锁。

代码分析如下:

//线程死锁
public class DeadLock_ {
    public static void main(String[] args) {
        //新建两个DeadLockDemo对象 a b
        DeadLockDemo a = new DeadLockDemo(true);
        a.setName("A");//设置线程名称
        DeadLockDemo b = new DeadLockDemo(false);
        b.setName("B");
        //启动线程
        a.start();
        b.start();
    }
}
//死锁演示
class DeadLockDemo extends Thread {
    //先定义两个object对象
    //为了保证多线程共享一个对象需要在前面加上static关键字
   static Object  o1 = new Object();
   static Object  o2 = new Object();
   //定义一个boolean对象 用作条件判断
   boolean flag;
   //创建DeadLockDemo的有参构造器
   public DeadLockDemo(boolean flag){//传入flag
        this.flag = flag;//这里的flag = 构造器传入的flag
   }
   //重写run方法

    @Override
    public void run() {
        //设立以flag为条件的 判断语句
        if (flag){
              synchronized (o1){// 进入1 和 进入2 形成同步代码
                  System.out.println(Thread.currentThread().getName() + "进入1");
                  synchronized (o2){//这里只有获得o2锁才能继续往下执行 不然就一直停在上一条语句中
                      System.out.println(Thread.currentThread().getName() + "进入2");
                  }
              }
        }else {
            synchronized (o2){
                System.out.println(Thread.currentThread().getName() + "进入3");
                synchronized (o1){//这里只有获得o1锁才能继续往下执行 不然就一直停在上一条语句中
                    System.out.println(Thread.currentThread().getName() + "进入4");
                }
            }
        }
    }
}

运行结果如下:

解释:A线程在进入到if中时  flag 为true 此时 进入到synchronized(o1)中输出语句后,等待获取o2对象锁才能继续往下执行。而B线程也如此,在输出第一条语句后就会等待获取o1对象锁才能继续往下执行。但是双方是不可能让出对方的锁,这样就形成了死锁,两个语句都造成了同步代码的堵塞。所以最最最重要的是在编程中要规避这种情况的发生。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值