2015-05-17 78 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瞭解詳情。