可重入锁(又名递归锁)
可重入锁是指指在同一个线程在外层方法获取锁的时候,再进入该线程的内层方法会自动获取锁 (前提,锁对象得是同一个对象),不会因为之前已经获取过还没释放而阻塞。
如果是 1 个有 synchronized 修饰的递归调用方法,程序第 2 次进入被自己阻塞了岂不是天大的笑话,出现了作茧自缚。
所以 Java 中 ReentrantLock 和 synchronized 都是可重入锁,可重入锁的一个优点是可一定程度避免死锁。
可重入锁种类
- 隐式锁 Synchronized synchronized 是 java 中的关键字,默认是可重入锁,即隐式锁
在同步块中
public class ReEntryLockDemo {
public static void main(String[] args) {
final Object objectLockA = new Object();
new Thread(() -> {
synchronized (objectLockA) {
System.out.println("-----外层调用");
synchronized (objectLockA) {
System.out.println("-----中层调用");
synchronized (objectLockA) {
System.out.println("-----内层调用");
}
}
}
}, "a").start();
}
}
//-----外层调用
//-----中层调用
//-----内层调用
在同步方法中
public class ReEntryLockDemo {
public synchronized void m1() {
// 指的是可重复可递归调用的锁,在外层使用之后,在内层仍然可以使用,并且不发生死锁,这样的锁就叫做可重入锁
System.out.println(Thread.currentThread().getName() + + );
m2();
System.out.println(Thread.currentThread().getName() + );
}
{
System.out.println();
m3();
}
{
System.out.println();
}
{
();
reEntryLockDemo.m1();
}
}

