2015-05-17 43 views
1
void method1() { 
    synchronized(this) { // Acquires intrinsic lock 
     method2(); 
    } 
} 

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

第一次锁定在method1中获得,该方法调用synchronized方法2,其中第二次获取相同的锁定。可重入同步 - 所谓同步方法的解锁

现在我的疑问是当方法2()中的同步块结束时,第一次发生解锁并返回到方法1()的同步块,其中第二次再次解锁。

它是否在内部管理ReentrantLock之类的锁计数?

回答

1

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

是。从JLS section 17.1 - 强调我的。

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

1

是内部jdk跟踪再入口。

按照甲骨文的文档:

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

查看this了解详情。