hello啊,各位观众姥爷们!!!本baby今天又来报道了!哈哈哈哈哈嗝
线程死锁的原理及避免方法
线程死锁是多线程编程中因资源竞争导致的僵局,多个线程互相持有对方所需资源且不释放,导致所有线程永久阻塞。理解其原理并采取预防措施是避免死锁的关键。
// 线程 A
synchronized (lock1) {
Thread.sleep(100);
synchronized (lock2) { ... }
}
// 线程 B
synchronized (lock2) {
Thread.sleep(100);
synchronized (lock1) { ... }
}
两个线程以不同顺序获取 lock1
和 lock2
,可能进入死锁状态。
// 通过一个全局锁一次性获取所有资源
synchronized (globalLock) {
synchronized (lock1) {
synchronized (lock2) { ... }
}
}
ReentrantLock lock1 = new ReentrantLock();
ReentrantLock lock2 = new ReentrantLock();
// 尝试获取锁,超时后释放
if (lock1.tryLock(1, TimeUnit.SECONDS)) {
try {
if (lock2.tryLock(1, TimeUnit.SECONDS)) {
try { ... } finally { lock2.unlock(); }
}
} finally { lock1.unlock(); }
}
ReentrantLock
的 tryLock()
方法。// 统一先获取 lock1,再获取 lock2
synchronized (lock1) {
synchronized (lock2) { ... }
}
Object[] locks = { lock1, lock2 };
Arrays.sort(locks); // 按哈希值排序
synchronized (locks[0]) {
synchronized (locks[1]) { ... }
}
jstack
:生成线程转储,分析线程堆栈中的锁持有和等待关系。ConcurrentHashMap
分段锁)。Executor
框架管理线程池。CountDownLatch
、CyclicBarrier
替代显式锁。AtomicInteger
、Disruptor
)。避免死锁方法 | 核心思想 | 适用场景 |
---|---|---|
固定资源顺序 | 破坏循环等待条件 | 多锁嵌套场景 |
超时释放 | 破坏不可抢占条件 | 高竞争、复杂同步逻辑 |
一次性申请资源 | 破坏占有且等待条件 | 资源需求明确且固定 |
无锁编程 | 避免互斥条件 | 计数器、状态标志等简单操作 |
关键原则:
你想要的技术资料我全都有:https://pan.q删掉汉子uark.cn/s/aa7f2473c65b