常见面试题之死锁

定义

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

上代码

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

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

相关推荐
techdashen1 分钟前
kTLS 进入 rustls 组织:把 TLS 的数据面交给内核
开发语言·php
Lhappy嘻嘻17 分钟前
Java 并发编程(六)|并发进阶高频:CAS、锁升级
java·开发语言
techdashen20 分钟前
Arborium:把 tree-sitter 语法高亮打包成 Rust 文档生态的基础设施
开发语言·后端·rust
要开心吖ZSH33 分钟前
MVCC 进阶:快照读 vs 当前读、幻读与 Next-Key Lock
java·数据库·sql·mysql·mvcc
京韵养生记37 分钟前
【无标题】
java·服务器·前端
会周易的程序员39 分钟前
microLog 后端开发指南
开发语言·c++·物联网·设计模式·日志·iot·aiot
水木流年追梦39 分钟前
agent面试必备31- AI Agent 核心进阶:工具路由(Tool Routing)
数据库·人工智能·oracle·面试·职场和发展·embedding
小强库计算机毕业设计39 分钟前
源码分享Spring Boot + Vue3 的校园社团管理系统
java·spring boot·后端·计算机毕业设计
Esaka_Forever40 分钟前
Python 完整内存管理机制详解
开发语言·python·spring
星空露珠1 小时前
迷你世界UGc3.0脚本Wiki[剧情动画模块管理接口 Timeline]
开发语言·数据结构·算法·游戏·lua