死锁

1.互斥 2.占有并等待 3.不可抢占 4.循环等待

解决

1.顺序加锁

2.限时等待

3.用cas

检测死锁:

  • Java 应用程序 (jstack) 这是排查 Java 死锁的首选工具

  • jstack 是 JDK 自带的命令行工具,用于生成 JVM 的线程快照(Thread Dump)。

    1. 找到你的 Java 进程 ID (PID),例如使用 jps 命令。

    2. 执行命令:jstack [PID]

    3. 分析输出:

      • jstack 非常智能,它会自动帮你分析死锁。如果你看到了 Found 1 deadlock. 或类似的字样,它会明确告诉你哪个线程持有了什么锁,并且正在等待什么锁。

      • 即使没有自动提示,你也可以手动分析:查找处于 BLOCKED 状态的线程,看它们 waiting to lock <0x...>,然后去搜索这个 <0x...> 锁被哪个线程 locked <0x...>,顺着链条找下去,如果发现一个闭环,就是死锁。

  • 数据库 (Database) 数据库系统(如 MySQL, PostgreSQL)通常内置了强大的死锁检测机制。

    • MySQL: 你可以通过 SHOW ENGINE INNODB STATUS; 命令查看最近一次的死锁信息 (LATEST DETECTED DEADLOCK)。