/**
* 避免死锁,我觉得有2种方式:
* 1、线程直接一把头获取所需要的全部锁,不要分步
* 2、线程获取A之后,再去获取B,超时仍未获取到B,则释放A
*/
public class AvoidDeadLock01 {
private static Lock lock1 = new ReentrantLock();
private static Lock lock2 = new ReentrantLock();
public static void acquireLocks(Lock lock1, Lock lock2) {
boolean isLock1Acquired = false;
boolean isLock2Acquired = false;
while (true) {
try {
isLock1Acquired = lock1.tryLock();
isLock2Acquired = lock2.tryLock();
} finally {
if (isLock1Acquired && isLock2Acquired) {
return;
}
if (isLock1Acquired) {
lock1.unlock();
}
if (isLock2Acquired) {
lock2.unlock();
}
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
public static void main(String[] args) {
Thread thread1 = new Thread(() -> {
acquireLocks(lock1, lock2);
System.out.println("=====线程1 获取到了2把锁=====");
lock1.unlock();
lock2.unlock();
});
Thread thread2 = new Thread(() -> {
acquireLocks(lock1, lock2);
System.out.println("=====线程2 获取到了2把锁=====");
lock1.unlock();
lock2.unlock();
});
thread1.start();
thread2.start();
}
}