[英]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.