2010-05-23 70 views
1

聲明:我並不擅長Java,只是比較C#和Java之間的讀/寫鎖定,以便更好地理解這個主題。java.util.concurrent.locks.ReentrantReadWriteLock的文檔

There is JavaDoc about ReentrantReadWriteLock。它規定了對鎖以下有關升級/降級:

  • 鎖定降級 ... 然而,從讀鎖定寫鎖定升級是不可能的。

它還具有以下的例子,顯示了讀鎖定手動升級到寫入鎖:

// Here is a code sketch showing how to exploit reentrancy 
// to perform lock downgrading after updating a cache 

void processCachedData() { 
rwl.readLock().lock(); 
if (!cacheValid) { 
    // upgrade lock manually 
    #1: rwl.readLock().unlock(); // must unlock first to obtain writelock 
    #2: rwl.writeLock().lock(); 
    if (!cacheValid) { // recheck 
     ... 
    } 
    ... 
} 
use(data); 
rwl.readLock().unlock(); 

這是否意味着實際上從上面的例子可能無法正確在某些情況下的行爲 - 我的意思是行#1 &#2之間沒有鎖定,並且底層結構暴露於其他線程的更改。所以它不能被認爲是升級鎖的正確方式,或者我錯過了這裏的東西嗎?

回答

1

是的,你是對的。但是,這段代碼在獲取寫入鎖之後再次調用if (!cacheValid) { // recheck來處理這種情況。

+0

謝謝,沒有注意'cacheValid'變量的雙重檢查是誠實的 – 2010-05-23 08:57:26