避免死锁的常用方法包括:
- 避免嵌套锁:不要在持有一个锁的情况下再请求另一个锁。
- 锁顺序化:确保锁的获取顺序是一致的。
- 使用定时锁:
ReentrantLock
提供了tryLock(long timeout, TimeUnit unit)
方法,可以设置超时时间。 - 锁分级机制:分级锁可以避免某些情况下的死锁。
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;
public class AvoidDeadlock {
private static final ReentrantLock lock1 = new ReentrantLock();
private static final ReentrantLock lock2 = new ReentrantLock();
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
try {
LOCK1.lockInterruptibly();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (!lock2.tryLock(5, TimeUnit.SECONDS)) {
System.out.println("无法获取锁,已退出");
return;
}
// 业务逻辑
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
if (lock2.isHeldByCurrentThread()) {
lock2.unlock();
}
if (lock1.isHeldByCurrentThread()) {
lock1.unlock();
}
}
}
}).start();
}
}
在这个例子中,使用了 ReentrantLock
的 lockInterruptibly
方法来获取锁,并使用 tryLock
方法来尝试获取另一个锁,并设置了超时时间,这样可以避免死锁的发生。如果在指定时间内无法获取锁,则会退出线程,释放已经获取到的锁。