我是并發散列映射的新手,我想知道是否可以獲得有關該.remove(key)方法的一些指導。
如果我有一個并發散列映射,它有 1 個鍵,但有幾個映射到該鍵的值,我該如何洗掉與鍵關聯的值,但不洗掉與鍵關聯的鍵和其他值?
如果我有類似的東西:
ConcurrentHashMap<String, List<String>> userValues = new ConcurrentHashMap<>();
userValues.computeIfAbsent(user, key -> new ArrayList<>()).add(value1);
userValues.computeIfAbsent(user, key -> new ArrayList<>()).add(value2);
userValues.computeIfAbsent(user, key -> new ArrayList<>()).add(value3);
userValues.computeIfAbsent(user, key -> new ArrayList<>()).add(value4);
我列印出我的地圖我得到了一個輸出:
{user=[value1, value2, value3, value4]}
我想做一些類似的事情userValues.remove(value1)來獲得新的輸出{user=[value2, value3, value4]}
我如何在上面的代碼中正確且執行緒安全地執行我想要的操作?
uj5u.com熱心網友回復:
使用ArrayList不會是執行緒安全的。您可以將映射功能切換為key -> Collections.synchronizedList(new ArrayList<>())
ConcurrentHashMap<String, List<String>> userValues = new ConcurrentHashMap<>();
Function<? super String, ? extends List<String>> mappingFunction = key -> Collections.synchronizedList(new ArrayList<>());
userValues.computeIfAbsent(user, mappingFunction).add(value1);
userValues.computeIfAbsent(user, mappingFunction).add(value2);
userValues.computeIfAbsent(user, mappingFunction).add(value3);
userValues.computeIfAbsent(user, mappingFunction).add(value4);
userValues.get(user).remove(value3);
=>
userValues ==> {user=[value1, value2, value4]}
您可以考慮其他執行緒安全的 List 實作,例如CopyOnWriteArrayList.
uj5u.com熱心網友回復:
以下雖然丑陋但執行緒安全。檢查 javadocsConcurrentHashMap.computeIfPresent和compute!
userValues.compute(user, (k, v) -> {
if (v == null) v = new ArrayList<>();
v.add(value1);
return v;})
userValues.computeIfPresent(user, (k, v) -> {v.remove(value1); return v;})
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/345758.html
