编写一个示例程序,展示如何产生多线程死锁的情况。
示例:多线程死锁
程序输出示例:
Thread 1: Locked resource 1
Thread 2: Locked resource 2
Thread 1: Waiting to lock resource 2
Thread 2: Waiting to lock resource 1
程序会卡在两个线程都等待对方释放锁的地方,形成死锁。
程序详解:
- 死锁的产生原因:
- 线程 1 持有
resource1
的锁,尝试获取resource2
的锁。 - 线程 2 持有
resource2
的锁,尝试获取resource1
的锁。 - 两个线程相互等待对方释放资源,导致死锁。
- 线程 1 持有
- 模拟死锁:
- 使用
Thread.sleep(100)
模拟资源占用时间,增加死锁发生的可能性。 - 线程 1 和线程 2 的锁定顺序不同(一个先锁定
resource1
再锁定resource2
,另一个相反),形成竞争条件。
- 使用
如何避免死锁?
- 始终按相同顺序获取锁: 确保所有线程都以固定顺序请求锁,可以避免循环等待。
修改代码:
- 使用
tryLock()
(ReentrantLock): 使用java.util.concurrent.locks.ReentrantLock
,尝试获取锁,避免死锁。示例:
-
检测和处理死锁: 使用线程监控工具(如 JConsole 或 VisualVM)检测和分析死锁。