死锁的介绍

什么是死锁?(把死锁给大家讲明白,知道是什么,为什么用,怎么用)-CSDN博客

什么是死锁,产生死锁的必要条件,以及避免死锁的方法-CSDN博客 

讲得特别特别的好 常看常新

package com.example;

public class Deadlock {

       public static String str1 = "str1";
        public static String str2 = "str2";

        public static void main(String[] args){
            Thread a = new Thread(() -> {
                try{
                    while(true){
                        synchronized(Deadlock.str1){
                            System.out.println(Thread.currentThread().getName()+"锁住 str1");
                            Thread.sleep(1000);
                            synchronized(Deadlock.str2){
                                System.out.println(Thread.currentThread().getName()+"锁住 str2");
                            }
                        }
                    }
                }catch(Exception e){
                    e.printStackTrace();
                }
            });

            Thread b = new Thread(() -> {
                try{
                    while(true){
                        synchronized(Deadlock.str2){
                            System.out.println(Thread.currentThread().getName()+"锁住 str2");
                            Thread.sleep(1000);
                            synchronized(Deadlock.str1){
                                System.out.println(Thread.currentThread().getName()+"锁住 str1");
                            }
                        }
                    }
                }catch(Exception e){
                    e.printStackTrace();
                }
            });

            a.start();
            b.start();
        }
    }




  1. 初始化资源: str1str2 是两个静态字符串资源,代表要被两个线程访问和锁定的资源。
  2. 线程a的操作:
    • 线程a开始执行,并首先尝试锁定str1synchronized(Deadlock.str1))。
    • 成功锁定str1后,线程a输出“锁住 str1”,然后进入sleep状态(模拟耗时操作)。这个sleep期间,它保持着对str1的锁定。
    • sleep结束后,线程a尝试锁定str2synchronized(Deadlock.str2))。但是,如果线程b已经锁定了str2,线程a将在这里等待,直到str2变得可用(即被释放)。
  3. 线程b的操作:
    • 线程b几乎同时开始执行,并首先尝试锁定str2synchronized(Deadlock.str2))。
    • 成功锁定str2后,线程b输出“锁住 str2”,然后同样进入sleep状态(模拟耗时操作)。这期间,它保持着对str2的锁定。
    • sleep结束后,线程b尝试锁定str1synchronized(Deadlock.str1))。但是,如果线程a已经锁定了str1,线程b将在这里等待,直到str1变得可用。
  4. 死锁产生:
    • 如果线程a和线程b分别锁定了str1str2,且都在等待对方释放锁,就会出现死锁。
    • 线程a等待str2被释放,而线程b等待str1被释放。但是,它们都不会释放自己已经持有的锁,因为它们都在等待获取第二个锁才能继续执行,导致了无法解决的循环等待状态。

在这个例子中,死锁的根本原因是两个线程以不同的顺序请求相同的资源。线程a先请求str1然后是str2,而线程b先请求str2然后是str1。这种锁请求顺序的不一致性是产生死锁的关键因素。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值