news 2026/11/3 5:09:39

高频面试题:Java死锁问题如何解决?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
高频面试题:Java死锁问题如何解决?

大家好,我是锋哥。今天分享关于【高频面试题:Java死锁问题如何解决?】面试题。希望对大家有帮助;

高频面试题:Java死锁问题如何解决?

死锁产生的四个必要条件(缺一不可)

  1. 互斥(Mutual Exclusion)—— 锁只能被一个线程持有
  2. 持有并等待(Hold and Wait)—— 持有至少一个锁,同时等待另一个锁
  3. 不可抢占(No Preemption)—— 锁只能由持有者主动释放
  4. 循环等待(Circular Wait)—— 线程之间形成环形等待链

解决死锁的核心思想:破坏上面任意一个条件(最常用的是破坏第4个,其次是第2个)。

实际开发中最有效的解决 & 预防手段(按推荐优先级排序)

优先级方法核心思想适用场景缺点/代价代码示例关键点
★★★★★固定锁获取顺序(Lock Ordering)破坏循环等待绝大多数业务场景需要提前规划锁的全局顺序所有线程都按相同顺序获取锁(如按id排序)
★★★★☆使用带超时的锁(tryLock)破坏不可抢占 + 持有并等待锁竞争激烈、容易死锁的场景业务需处理获取失败的情况ReentrantLock.tryLock(时间, 时间单位)
★★★★☆减小锁粒度 + 缩短锁持有时间减少持有并等待时间窗口锁保护范围过大的代码代码改动较大只在真正需要线程安全的地方加锁
★★★☆☆避免嵌套锁 / 锁的交叉使用避免持有并等待老代码重构、复杂业务逻辑有时难以完全消除尽量把获取第二个锁的代码移出第一个锁范围
★★★☆☆一次性申请所有资源破坏持有并等待资源有限且数量可知的场景实现复杂,容易浪费资源类似银行家算法或先尝试获取所有锁
★★☆☆☆使用更高级的并发工具从根本上减少显式加锁可以用新结构替换旧代码的地方学习成本、改造成本较高ConcurrentHashMap、CopyOnWrite、StampedLock、CompletableFuture 等
★★☆☆☆死锁检测 + 自动恢复事后补救(非首选)极难避免死锁的遗留系统业务可能受损,复杂ThreadMXBean.findDeadlockedThreads()

最常用、最推荐的代码实践写法对比

容易死锁的写法(经典转账示例)

public void transfer(Account from, Account to, int amount) { synchronized (from) { synchronized (to) { // 嵌套锁 + 顺序不一致 → 极易死锁 // 转账逻辑 } } }

推荐写法1:固定锁顺序(最常用、最安全)

public void transfer(Account from, Account to, int amount) { // 按账户ID的自然顺序加锁(破坏循环等待) Account first = from.getId() < to.getId() ? from : to; Account second = first == from ? to : from; synchronized (first) { synchronized (second) { // 转账逻辑 } } }

推荐写法2:使用带超时的 ReentrantLock(更灵活)

private final ReentrantLock lock1 = new ReentrantLock(); private final ReentrantLock lock2 = new ReentrantLock(); public boolean transferWithTimeout() { try { if (!lock1.tryLock(5, TimeUnit.SECONDS)) { return false; // 或抛出自定义异常 } try { if (!lock2.tryLock(5, TimeUnit.SECONDS)) { return false; } try { // 转账逻辑 return true; } finally { lock2.unlock(); } } finally { lock1.unlock(); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); return false; } }

快速记忆口诀(生产环境最常说的一句话)

“要么锁的顺序全局统一,要么加锁带超时,其他都是辅助手段。”

最后几条生产环境铁律

  1. 尽量避免在 synchronized 块里调用外部方法(尤其是可能阻塞、IO、网络、加锁的方法)
  2. 锁保护的范围越小越好,能用局部变量锁就别用对象锁
  3. 能用java.util.concurrent包下的工具就尽量别手写 synchronized + wait/notify
  4. 定期做代码审查,特别关注多个锁同时出现的业务逻辑
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/2 3:26:55

广州沙太路在哪?位置、周边场所与出行指南

沙太路是广州一条重要的交通干道&#xff0c;连接着天河区与白云区。作为长期在周边区域活动的居民&#xff0c;我对这条路有着切身的了解。它不仅是通勤要道&#xff0c;沿途更分布着多个大型物流园区、专业市场和居民区&#xff0c;功能复合&#xff0c;日常车流量和人流量都…

作者头像 李华
网站建设 2026/11/2 2:28:50

黄金破5600、股市连涨:钱从哪来?我们普通人怎么办?大国博弈+地缘冲突+去美元化”三重叠加

黄金破5600、股市连涨:钱从哪来?没资产的人只能看着吗? 目录 黄金破5600、股市连涨:钱从哪来?没资产的人只能看着吗? 一、先搞懂:“双涨”的钱,到底从哪来? 1. 全球央行“放水+换仓”:最大的“金主” 2. 居民和机构“弃房弃存”:最广的“散户钱” 3. 企业盈利“造血…

作者头像 李华
网站建设 2026/11/2 2:29:13

变色龙chameleonMini的使用方法

首先把chameleonMini下载驱动Lab401 后 下载后直接解压缩文件点击exe。 连接上数据线。 再打开软件页面&#xff0c;如下&#xff1a; 一共有8个slot就是槽位号&#xff0c;按上面的黑色安全切换槽位号&#xff0c;下面的红色按钮刷卡操作。 可以实现八个卡片的模拟操作&…

作者头像 李华
网站建设 2026/11/2 2:28:32

好写作AI:临床医学论文的伦理审查与AI辅助写作平衡点探索

当医学研究遇上人工智能&#xff1a;伦理审查不可逾越的红线临床医学论文写作&#xff0c;与其他学科相比承载着一份特殊的重量——生命伦理与科研诚信的双重责任。从患者知情同意、隐私保护&#xff0c;到研究方案的风险收益评估&#xff0c;伦理审查贯穿始终。对于医学生而言…

作者头像 李华
网站建设 2026/11/2 2:29:16

AI写论文的宝藏!4款AI论文生成工具,帮你攻克论文写作难关!

你是否还在为撰写期刊论文、毕业论文或职称论文而感到烦恼&#xff1f;在进行人工写作时&#xff0c;面对海量的文献资料&#xff0c;真是像大海捞针一般困难。而复杂的格式规范更是让人应接不暇&#xff0c;反复的修改也让人心力交瘁&#xff0c;效率低下成了许多学术爱好者共…

作者头像 李华
网站建设 2026/11/2 2:28:03

54 Redis限流实现

Redis限流实现 本文深入剖析Redis限流的核心算法与实现方案,详解令牌桶、漏桶、滑动窗口三大算法原理,掌握Redisson RRateLimiter的使用技巧,构建生产级分布式限流系统。 1 为什么需要限流? 1.1 限流的业务价值 在高并发场景下,系统面临的主要风险: 常见问题: 流量突刺:秒杀…

作者头像 李华