可重入锁(递归锁)
在同一个线程在外层方法获取锁的时候,再进入该线程的内层方法会自动获取锁(前提,锁对象得是同一个对象),不会因为之前已经获取过还没释放而阻塞。
如果是1个有 synchronized 修饰的递归调用方法,程序第2次进入被自己阻塞了岂不是天大的笑话,出现了作茧自缚。所以Java中ReentrantLock和synchronized
都是可重入锁,可重入锁的一个优点是可一定程度避免死锁。
示例:
public class ReentryLockMain {
private static final Object reetryLockA = new Object();
public static void main(String[] args) {
Thread a = new Thread(() -> {
reLock();
}, "a");
a.start();
try {
a.join();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static int i=0;
public static void reLock(){
synchronized (reetryLockA){
if(i==5){
return ;
}else{
i++;
System.out.println(i+"调用");
//递归调用
reLock();
}
}
}
}