2016-02-12 93 views
5

我們如何在保持線程安全的同時訪問多個併發數據結構?有沒有可能做到這一點沒有同步?線程安全訪問多個併發數據結構

舉個簡單的例子:

ConcurrentHashmap m; 
CopyOnWriteArrayList l; 

public bool enterListNode(int elem) { 
    Node node = l.get(elem); 
    String key = node.key(); //key is immutable 
    int val = node.val(); //val is immutable 
    val = m.putIfAbsent(key, val); 
    return val; 
} 

這個例子不是線性化,因爲它可能是當我們做putIfAbsent(key, val),即(node==l.get(elem))不再是真實的。

除了添加鎖之外,還有什麼辦法可以解決這個問題嗎?

+3

這是一個很好的問題,因爲要求外部資源(即例子),因此離題越來越近。我已經重寫了它以避免這個問題。如果您覺得它太多變化,您可以恢復或編輯。您可能想查看[幫助],並閱讀[問]指針。 –

+0

對於這個特定的例子,正如你所說的那樣,它並不完全起作用,這取決於你需要提供的保證(例如,如果m稍微落後於l,它可能沒問題)。在一般情況下,你不能真正回答這個問題。 – jtahlborn

回答

0

例如,如果您放入列表l的對象從未被替換,但只有對象Node中包含的值被修改,那麼您將不需要鎖定。但是實現起來會很棘手,因爲你需要在你的程序開始時用空對象填充你的數組。

然後,從列表中檢索的所有對象將與列表中的相同,並且您將是安全的。

相關問題