📜  Java同步-监视器重入(1)

📅  最后修改于: 2023-12-03 15:32:02.794000             🧑  作者: Mango

Java同步-监视器重入

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");
    }
}

在上面的代码中,firstMethodsecondMethod都是同步方法,它们都使用了synchronized关键字来获取对象锁。当一个线程调用firstMethod方法时,它会获得对象锁,并进入synchronized代码块。在这个方法中,它调用了secondMethod方法,但是不需要再次获取锁,因为它已经拥有了锁。

当第一个线程正在执行secondMethod方法时,另一个线程尝试调用firstMethod方法,但是它会被阻塞,直到第一个线程释放对象锁。这就是监视器重入的作用。

总结:

  • 监视器是一种同步机制,用于控制共享数据的访问。
  • 当一个线程已经拥有一个对象锁时,它可以重新进入同步块,这被称为“监视器重入”。
  • 监视器重入可以提高代码的执行效率,避免死锁等问题。