欢迎各位点赞👍评论✍收藏⭐
1. 死锁本质
两个或多个事务为争夺资源形成互相等待的僵局,类似 “抢筷子” 场景 —— 若双方都不松手,最终谁也无法继续
2. 典型场景
通过两个线程对资源加锁顺序相反的例子说明死锁。
- 线程 1 先通过 synchronized 关键字对 resource1 加锁,在同步代码块内部又尝试对 resource2 加锁;
- 线程 2 则相反,先对 resource2 加锁,再尝试对 resource1 加锁。
- 若线程 1 持有 resource1 锁,线程 2 持有 resource2 锁,两者后续尝试获取对方资源锁时会相互等待,导致死锁
3. 死锁的检测方法
通过工具检测死锁,如 JDK 提供的 jstack 工具获取线程转储信息,分析线程状态
4. 死锁的预防措施
预防死锁的主要方案包括:
- 统一资源加锁顺序,确保所有线程按相同顺序获取资源(如调整线程 2 的加锁顺序,与线程 1 一致:先 resource1 再 resource2)
- 使用非阻塞获取锁的方法,如 ReentrantLock 的 tryLock 方法设置超时时间(如 100 毫秒),若超时未获取锁则返回,避免永久阻塞等待
转载自CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/Gao123456fy/article/details/159736477




