Skip to content

场景:支付回调线程池所有线程 BLOCKED,系统无响应。
步骤:

  1. jstack pid > jstack.log

  2. 搜索 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
  3. 代码定位:订单锁与账户锁交叉嵌套。
    解决:
    • 统一锁顺序:先锁账户,再锁订单
    • 使用 Lock.tryLock(timeout) 替代 synchronized,超时主动回滚
    结果:压测 10 万并发无死锁,告警 0 次。

  4. 线上死锁真实案例

场景:
支付回调线程池 100 个线程全部 BLOCKED,接口 504。

排查过程:

  1. jstack pid > js.log

  2. Found one Java-level deadlock

    复制

    Thread-20:  waiting to lock <OrderLock@1234>  
    Thread-35:  waiting to lock <AccountLock@5678>
  3. 代码定位:订单锁与账户锁交叉嵌套。

解决:
• 统一锁顺序:先锁账户再锁订单
• 改用 Lock.tryLock(200, ms) + 降级策略
结果:压测 10 w 并发无死锁,告警 0 次。

三板斧:缓存、限流、异步化 解决 90% 高并发问题。