常见面试题之死锁

定义

死锁就是两个或两个以上的线程在执行过程中,由于竞争资源或者互相通信导致彼此占用对方的锁资源而造成的一种阻塞现象,在没有外界作用下都在等待对方释放锁资源,导致程序无法进行下去。

上代码

java 复制代码
public class t9 {
    public static void main(String[] args) {
        //定义了两把锁
        Object lockA = new Object();
        Object lockB = new Object();
        //使用lanbda表达式新建线程
        Thread t1 = new Thread(() -> {
            // 1.占有一把锁(锁A)
            synchronized (lockA) {
                System.out.println("线程1:获得锁A。");
                // 休眠 1s(让线程2有时间先占有锁B)
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                // 2.获取线程2的锁B
                synchronized (lockB) {
                    System.out.println("线程1:嘿嘿,我抢到锁B了。");
                }
            }
        });
        t1.start();

        Thread t2 = new Thread(() -> {
            // 1.占有一把锁(锁B)
            synchronized (lockB) {
                System.out.println("线程2:获得了锁B!");
                // 休眠1s(保证线程1能有充足的时间得到锁A)
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                // 2.获取线程1的锁A
                synchronized (lockA) {
                    System.out.println("线程2:嘿嘿,我抢到锁A了!");
                }
            }
        });
        t2.start();

    }
}

解决方案

1.修改请求并持有条件 :

获得了一把锁就不再请求另一把锁,别吃着碗里看着锅里了

2.破坏环路等待条件:

以确定的顺序获得锁,系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,比如上面线程一和二按照数字大小依次请求锁A和B

3.超时放弃

如果在一定时间内没有获得锁,就将之前获得的锁全部释放

相关推荐
独泪了无痕6 小时前
探索Pinyin4j-Java中的拼音转换利器
java·后端
道尔柯南8 小时前
C++ string 类详解:从常用接口到深拷贝,彻底掌握字符串处理
android·java·c++
岁月宁静8 小时前
AI 应用开发工程师简历怎么写:HR 初筛、技术复筛、面试追问,三道关卡各看什么?
人工智能·python·面试
来让爷抱一个9 小时前
Python 异步里混用同步库,事件循环被卡住的全过程
开发语言·python
kingx39 小时前
Bugku 3122 谷歌小恐龙题解:纯离线逆向 Vault 的 AES-GCM 加密资源(附 Python 解密器)
java·逆向·ctf·bugku·aes-gcm
Dream it possible!10 小时前
LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等)
算法·leetcode·面试·动态规划
DevOpenClub11 小时前
职教高考控制线 API:招生类别枚举、筛选与空分数含义
java·数据库·高考
心祭丫丫11 小时前
【每天一个 Python 小案例17】Python 实现通讯录
开发语言·人工智能·笔记·python·学习
露天赏雪12 小时前
第3篇:Sentinel熔断降级实战:大模型接口抖动时的服务兜底方案
java·开发语言·人工智能·spring boot·spring·servlet·sentinel
天天被压力12 小时前
【A股分钟级高频数据完全手册 #06】北交所分钟级数据接口:京市股票Pro版最新分时
java·人工智能·python