2010-07-21 34 views
7

我有一個大型數組可供多線程訪問。單一鎖定效率不夠高。在java或scala中是否有範圍鎖定類?在java中的範圍鎖定

+0

如果陣列只訪問並沒有修改,那麼你不需要任何類型的鎖。 (假設在線程開始讀取之前數組已完全填充,以確保發佈初始更改。) – mdma 2010-07-21 19:37:13

回答

1

將數組包裹在控制訪問的線程安全對象內。您可以自己管理範圍,也可以將數組拆分成範圍,每個範圍都有自己的鎖,並以此方式引用它。

6

不在標準庫中。 ConcurrentHashMap雖然這樣做,內部表示哈希表爲「段」(默認情況下16),其中每個用一個單獨的鎖保護。另外,this thread詢問除ArrayList而不是數組之外的相同問題。雖然沒有結果,但如果您能夠妥協使用,它會提出替代方案。

更新:也許AtomicReferenceArrayandfriends將提供您正在尋找的,而在同一時間它「提供]揮發性訪問語義到數組的元素」效率(JCIP 15.3)。

2

Generaly來講,除非你有併發的任期確實具體需要,你會發現在JDK的java.util.concurrent包非常優化,便捷對象。

我可以建議作者Brian Goetz的「Java併發實踐」,一本很好的書解釋有關Java和java.util.concurrent包也穿了很多東西。

0

這實際上取決於您的使用情況。如果你實際上意味着的ArrayList並不僅僅是陣列,那麼你可能會推出自己和條帶你的鎖,爲的ArrayList可以調整這才能真正搞砸未sychronized讀取和寫入。

但是,如果實際上您的意思是陣列,我不確定我明白你的意思。你不需要鎖,沒有鎖就能正常工作。另一個線程可能不會馬上看到變化,但那不是世界末日。