0

嗨,我已經閱讀了關於Java中的ReadWriteLock,但我不知道我已經掌握了它的reentrance部分。 這裏是僅使用一個主線程來顯示重入Java ReadWriteLock再入

public class Locks { 
    public static void main(String[] args) { 
     ReadWriteLock lock = new ReentrantReadWriteLock(); 
     lock.writeLock().lock(); 
     lock.readLock().lock(); 
     System.out.println("Reentrance acheieved"); 
     lock.readLock().unlock(); 
     lock.writeLock().unlock(); 
    } 
} 

兩次短暫代碼示例和第二示例

public class Locks { 
    public static void main(String[] args) { 
     ReadWriteLock lock = new ReentrantReadWriteLock(); 
     lock.readLock().lock(); 
     lock.writeLock().lock(); 
     System.out.println("Reentrance acheieved"); 
     lock.writeLock().unlock(); 
     lock.readLock().unlock(); 
    } 
} 

在執行系統輸出而不是在第二個中的第一個,這是爲什麼那?兩個鎖都是通過同一個線程獲得的,所以我們在這裏有一個再入境的情況,但是隻有在首先獲得寫鎖時才能實現入口,這是奇怪的,因爲在非重入情況下,文檔說寫操作是所有其他操作(無論是寫入還是讀取)。

+0

的可能的複製【JAVA ReentrantReadWriteLocks - 如何安全地獲取寫鎖(http://stackoverflow.com/questions/464784/java-reentrantreadwritelocks-how-to-safely-acquire-write-lock) – shmosel

回答

2

答案就在那裏下的「重入」的文件中:

此鎖允許讀者和作家獲取讀取或按照ReentrantLock的風格寫 鎖。在寫入線程持有的所有寫入鎖定已被釋放的 之前,非重入式讀取器不允許 。

另外,作者可以獲取讀鎖,但反之亦然。 在其他應用程序中,當在調用或回調過程中執行讀取鎖的 讀取方法時,在寫入鎖 期間保持重入狀態可能很有用。 如果讀者試圖獲得寫入鎖定,它將永遠不會成功。