可重入同步 - 解锁被调用的同步方法

时间:2015-05-17 07:51:48

标签: java multithreading synchronized-block

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

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

在method1中获取第一次锁定,该方法调用synchronized方法2,第二次获得相同的锁定。

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

它是否在内部管理像ReentrantLock中的锁定计数?

2 个答案:

答案 0 :(得分:3)

  

它是否在内部管理像ReentrantLock中的锁定计数?

是。来自JLS section 17.1 - 强调我的。

  

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

答案 1 :(得分:2)

是的,内部jdk跟踪重入。

根据oracle docs:

  
    

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

  

有关详细信息,请参阅this