场景:支付回调线程池所有线程 BLOCKED,系统无响应。
步骤:
jstack pid > jstack.log搜索
Found one Java-level deadlock,发现Thread-1: waiting to lock monitor 0x... (object=OrderLock@1234), which is held by Thread-2 Thread-2: waiting to lock monitor 0x... (object=AccountLock@5678), which is held by Thread-1代码定位:订单锁与账户锁交叉嵌套。
解决:
• 统一锁顺序:先锁账户,再锁订单
• 使用Lock.tryLock(timeout)替代synchronized,超时主动回滚
结果:压测 10 万并发无死锁,告警 0 次。线上死锁真实案例
场景:
支付回调线程池 100 个线程全部 BLOCKED,接口 504。
排查过程:
jstack pid > js.log搜
Found one Java-level deadlock复制
Thread-20: waiting to lock <OrderLock@1234> Thread-35: waiting to lock <AccountLock@5678>代码定位:订单锁与账户锁交叉嵌套。
解决:
• 统一锁顺序:先锁账户再锁订单
• 改用 Lock.tryLock(200, ms) + 降级策略
结果:压测 10 w 并发无死锁,告警 0 次。
• 三板斧:缓存、限流、异步化 解决 90% 高并发问题。