避免死锁的常用方法包括:

  1. 避免嵌套锁:不要在持有一个锁的情况下再请求另一个锁。
  2. 锁顺序化:确保锁的获取顺序是一致的。
  3. 使用定时锁:ReentrantLock 提供了 tryLock(long timeout, TimeUnit unit) 方法,可以设置超时时间。
  4. 锁分级机制:分级锁可以避免某些情况下的死锁。
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 方法来尝试获取另一个锁,并设置了超时时间,这样可以避免死锁的发生。如果在指定时间内无法获取锁,则会退出线程,释放已经获取到的锁。