📅  最后修改于: 2023-12-03 15:32:02.794000             🧑  作者: Mango
Java中的监视器是一种同步机制,它利用了Java对象系统中的锁来提供对共享数据的访问。当一个线程已经获得了一个对象锁时,如果它再次尝试获取这个对象的锁,那么它就会进入到对象的监视器缓存中,并且能够释放它已经获得的锁。
这种重新进入同步块的行为被称为“监视器重入”(Monitor Re-Entry)。在Java中,所有对象都有一个内置的监视器。可以使用synchronized
关键字来获得这个对象的锁,从而实现同步。下面是一段简单的示例代码:
public class Counter {
private int count = 0;
public synchronized void increment() {
count++;
System.out.println("count is now " + count);
}
}
在上面的代码中,increment
这个方法使用了synchronized
关键字来实现同步。当一个线程进入这个方法时,它会获得Counter
对象的锁。如果另一个线程再次调用了这个方法,它会被阻塞,直到第一个线程退出这个方法并释放锁。
现在假设一个线程在increment
方法中,在执行到这个方法的一半时,它调用了一个同步方法,这个方法可能会访问相同的数据。这时,这个线程并不需要再次获取锁,因为它已经获得了这个锁。这种情况就是“监视器重入”。
下面是一个演示Monitor Re-Entry
的示例代码:
public class MonitorReentry {
public synchronized void firstMethod() {
System.out.println("In first method");
secondMethod();
}
public synchronized void secondMethod() {
System.out.println("In second method");
}
}
在上面的代码中,firstMethod
和secondMethod
都是同步方法,它们都使用了synchronized
关键字来获取对象锁。当一个线程调用firstMethod
方法时,它会获得对象锁,并进入synchronized
代码块。在这个方法中,它调用了secondMethod
方法,但是不需要再次获取锁,因为它已经拥有了锁。
当第一个线程正在执行secondMethod
方法时,另一个线程尝试调用firstMethod
方法,但是它会被阻塞,直到第一个线程释放对象锁。这就是监视器重入的作用。
总结: