面灵AI

去哪儿 Java 方向一面:转账模块与死锁处理

轮次
一面
时间
2026-09
来源
牛客网

《面试题目》

  1. 如何介绍自己的经历与岗位相关能力?
  2. 如何实现一个转账功能模块,并避免多个账户之间的并发转账发生死锁?

《参考解析》

先看死锁怎样产生

线程一从 A 向 B 转账,先锁住 A,再等待 B;线程二从 B 向 A 转账,先锁住 B,再等待 A。双方各持有一把锁并等对方释放,就形成了循环等待。

一个常见解法是统一加锁顺序。按唯一账户编号从小到大获取两把锁,所有转账路径都遵守这个顺序。校验金额、检查余额、扣款和入账应处于同一保护范围,异常退出时也要释放锁。自转账需要单独处理,不能因重复获取不支持重入的锁而卡住。

还要区分运行范围

进程内锁只保护当前进程的共享对象。如果账户存放在数据库,并且由多个服务实例处理,扣款和入账应放入数据库事务,统一行锁顺序,并设置业务请求的唯一标识以防重复执行。避免死锁和避免重复扣款是两个问题,答案要分别说清。

原帖没有给出 Java 与 Agent 基础题的具体题干,因此本篇题目清单仅保留能够确认的提问。