重入是指按每个线程而不是按调用获取锁。
让我用一个例子解释一下。
class ReentrantTester {
public synchronized void methodA() {
System.out.println("Now I am inside methodA()");
methodB();
}
public synchronized void methodB() {
System.out.println("Now I am inside methodB()");
}
public static void main(String [] args) {
ReentrantTester rt = new ReentrantTester();
rt.methodA();
}
}
输出为:
Now I am inside methodA()
Now I am inside methodB()
就像上面的代码一样,ReentrantTester包含两个同步的方法:methodA()和methodB()第一个同步方法methodA()调用另一个同步方法methodB()。
当执行进入methodA()时,当前线程获取ReentrantTester对象的监视器。现在,当methodA()调用methodB()时,由于methodB()也已同步,因此线程尝试获取再次使用同一台显示器。 由于Java支持可重入监视器,因此可以使用。 当前线程获取ReentrantTester的再次监视并继续执行methodA()和methodB()。
Java运行时允许线程重新获取它已经拥有的监视器,因为Java监视器是重入。 这些可重入监视器非常重要,因为它们消除了单线程的可能性在已经拥有的监视器上陷入僵局。