1.互斥 2.占有并等待 3.不可抢占 4.循环等待
| 解决 |
1.顺序加锁
2.限时等待
3.用cas
检测死锁:
Java 应用程序 (jstack) 这是排查 Java 死锁的首选工具。
jstack 是 JDK 自带的命令行工具,用于生成 JVM 的线程快照(Thread Dump)。
找到你的 Java 进程 ID (PID),例如使用 jps 命令。
执行命令:jstack [PID]
分析输出:
jstack 非常智能,它会自动帮你分析死锁。如果你看到了 Found 1 deadlock. 或类似的字样,它会明确告诉你哪个线程持有了什么锁,并且正在等待什么锁。
即使没有自动提示,你也可以手动分析:查找处于 BLOCKED 状态的线程,看它们 waiting to lock <0x...>,然后去搜索这个 <0x...> 锁被哪个线程 locked <0x...>,顺着链条找下去,如果发现一个闭环,就是死锁。
数据库 (Database) 数据库系统(如 MySQL, PostgreSQL)通常内置了强大的死锁检测机制。
|