2011-03-16 80 views
1

看起來很清楚,從文件讀取(例如)時使用readLock,寫入時使用writeLock是適當的。然而,如果我有其中兩個值進行比較的操作,如:什麼時候可以安全地使用ReentrantReadWriteLock類的readLock()方法?

if (i == j) { 
    System.out.println("equal); 
} 

然後是它好使用readLock()代替writeLock鎖定此代碼?當然,我沒有寫任何東西,但是我正在比較兩個值,這與僅僅讀取數據有點不同,因爲涉及到一個操作。請記住,「我」或「j」可隨時更改。從理論上講,如果writeLock()沒有修改資源,readLock()只會向前移動,但我可能不完全理解這個問題的所有複雜性。它似乎有一點灰色地帶的潛力,所以我想我會得到一些輸入。

感謝大家,

馬特

回答

3

不要去想讀/寫鎖在閱讀和寫作方面,認爲他們是獨家/共享。寫鎖定是獨佔的,讀鎖定是共享的。

要回答你的問題,這取決於。

假設您有1個線程正在更新i,另外一個線程正在更新j,另一個線程正在檢查是否相等。在這種情況下,寫入線程將獲得共享(讀取)鎖定,因爲它們都可以並行操作,因爲每個線程只更新1個變量。然後比較線程可以獲得排他鎖(寫入鎖)來比較和執行一個動作,防止在動作執行時進行任何更新。

因此,請考慮獨佔/共享以及您的應用程序的需求。

+0

你提到一個關於獨家和共享的好點。我在我的真實代碼中比較的兩個值來自1)一個方法(在必要時被鎖定)在另一個返回值的類中,2)來自我方法的未同步的局部變量。如果另一個線程調用它們,這些變量會立即發生變化,但readLock()應該能夠立即改變它們,並且如果它們正在改變,就停止閱讀這些值。非常感謝大家。 – 2011-03-16 06:17:30

0

雖然我覺得讓我Ĵ揮發性同步修改訪問它應該是足夠的。

但是說你必須使用讀寫鎖。在這種情況下,對於上面的代碼,您需要讀取鎖定。原因是你給出的代碼是一個非修改的代碼,它不會修改i或j。所以其他方法確實可以在沒有任何腐敗的情況下平行讀取i和j的價值。你只能在修改i和j值的地方使用寫鎖。

編輯:突出了「同步修改訪問它」來回答的評論

+0

@ user654801是的,你也必須同步我已經在我的答案中提到的修改訪問。 – 2011-03-16 05:31:13

+0

是的,你是對的 – sbridges 2011-03-16 05:35:44

相關問題