簡體   English   中英

ConcurrentHashMap和跨越2個單獨調用的操作

[英]ConcurrentHashMap and operations that span 2 separate calls

我了解ConcurrentHashMap方法是線程安全的,但是例如,不是原子的復合操作又如何呢?請看這段代碼-如果兩個不同的線程使用相同的“ myKey”同時調用它,則在競爭條件下是不可能的發生?

myMap是ConcurrentHashMap

myValues = myMap.get(myKey);
if (myValues == null) {
    myValues = new List()
    myMap.add(myKey, myValues);
}
myValue.add(new list item);

如何僅使用ConcurrentHashMap以線程安全的方式編寫以上代碼,而不使用單獨的Locks等,

putIfAbsent似乎也無法解決問題,或者像這樣可行:

myValues =  myMap.putIfAbsent(myKey, new List());
myValues.add(new list item);

這是正確的並且線程安全的嗎?
謝謝

使用原子的computeIfAbsent

說明文件:

如果指定的鍵尚未與某個值關聯,則嘗試使用給定的映射函數計算其值,除非為null,否則將其輸入此映射。 整個方法調用是原子執行的,因此每個鍵最多可應用一次該功能。 在進行計算時,可能會阻止其他線程在此映射上進行的某些嘗試的更新操作,因此計算應簡短而簡單,並且不得嘗試更新此映射的任何其他映射。

簡單用法:

ConcurrentHashMap<String, List<String>> map = new ConcurrentHashMap<>();
List<String> list = map.computeIfAbsent("myKey", key -> new CopyOnWriteArrayList<>());

編輯
正如@Holger正確注意到的那樣,在這種情況下使用ArrayList是不安全的。 使用CopyOnWriteArrayList更為安全,它是ArrayList的線程安全變體。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM