2013-03-31 34 views
5

我如何才能實現獨家寫作,但非獨家閱讀?我可以synchronize訪問setter並生成一個變量volatile?這夠了嗎?如何實現獨家寫作,但非獨家閱讀?

+1

什麼樣的變量是?有些類型具有保證的原子寫入。 –

+1

你能展示一個需要它的代碼嗎?在某些情況下,您可以簡單地標記變量volatile。 – assylias

回答

6

看那Java5的併發API:

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/locks/ReadWriteLock.html

這將實現您的要求,因爲你可以允許多個線程讀取無鎖,只有書寫時鎖定。

這裏一個有趣的帖子比較該API與傳統閱讀時同步:ReentrantReadWriteLock vs synchronized

此外,由於@assylias在評論說,你應該避免鎖定時,它是不是真的有必要。

事實上,你只能和只信任volatile關鍵字,如果兩個條件都滿足:

只能下 組受限的情況下使用volatile變量而不是鎖。爲了提供期望的線程安全性,以下兩個條件都必須滿足volatile變量:

_寫入變量不取決於其當前值。

_ 變量不參與其他變量的不變量。

+1

根據使用情況,可能沒有必要使用鎖定並且volatile可能就足夠了。 – assylias