1
void method1() {
     synchronized(this) {  // Acquires intrinsic lock
      method2();
    }   
}

void method2() {
     synchronized(this) {} // Acquires same lock due to Reentrant synchronization
}

第一次在调用同步方法 2 的方法 1 中获得锁,第二次获得相同的锁。

现在我的疑问是,当同步块在 method2() 结束时,第一次在这里发生解锁并返回到 method1() 的同步块,第二次再次解锁。

它是否像 ReentrantLock 那样在内部管理锁的数量?

4

2 回答 2

3

它是否像 ReentrantLock 那样在内部管理锁的数量?

是的。来自JLS 第 17.1 节- 强调我的。

Java 编程语言为线程之间的通信提供了多种机制。这些方法中最基本的是同步,它是使用监视器实现的。Java 中的每个对象都与一个监视器相关联,线程可以锁定或解锁监视器。一次只有一个线程可以锁定监视器。任何其他试图锁定该监视器的线程都会被阻塞,直到它们能够获得对该监视器的锁定。一个线程t可能会多次锁定一个特定的监视器;每次解锁都会反转一次锁定操作的效果

于 2015-05-17T07:55:34.153 回答
2

是的,jdk 在内部跟踪重入。

根据 oracle 文档:

回想一下,一个线程不能获得另一个线程拥有的锁。但是线程可以获取它已经拥有的锁。允许一个线程多次获取同一个锁可以实现重入同步。这描述了一种情况,同步代码直接或间接调用一个也包含同步代码的方法,并且两组代码都使用相同的锁。如果没有可重入同步,同步代码将不得不采取许多额外的预防措施来避免线程导致自身阻塞。

有关详细信息,请参阅

于 2015-05-17T07:55:20.830 回答