常见面试题之死锁

定义

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

上代码

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.超时放弃

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

相关推荐
kyriewen6 小时前
面试官问你:“AI 能写 80% 的代码了,公司为什么还需要你?”
前端·javascript·面试
冬奇Lab6 小时前
每日一个开源项目(第141篇):hiring-agent - HackerRank 开源了他们的简历评分系统,你的简历能得几分?
人工智能·面试·开源
kyriewen10 小时前
今天的科技圈,全在抢英伟达的饭碗
前端·面试·ai编程
白鲸开源11 小时前
Apache SeaTunnel Zeta Engine 的 Basic Auth 是怎么工作的?
java·vue.js·github
白鲸开源11 小时前
一文读懂DolphinScheduler插件机制:如何轻松扩展任务类型与数据源
java·架构·github
张元清15 小时前
React useIsomorphicLayoutEffect:修掉 SSR 下的 useLayoutEffect 警告(2026)
前端·javascript·面试
PBitW15 小时前
直接让GPT每日训练我!!!😕😕😕
前端·javascript·面试
用户2986985301416 小时前
Java 实现 Word 文档文本查找与高亮标注
java·后端
宇宙之一粟17 小时前
乐企版式文件生成平台
java·后端·python
以和为贵17 小时前
前端手写 RAG 踩坑实录:四个让检索"翻车"的坑
前端·人工智能·面试