ConcurrentHashMap单key对应多值时如何线程安全移除指定单个值
实现方案
ConcurrentHashMap自带的remove(Object key)方法会直接删除整个key对应的键值对,不符合你仅删除单个关联值的需求。你需要对key绑定的List执行元素删除操作,同时保证线程安全,以下是两种可行方案:
方案1:使用ConcurrentHashMap的原子compute方法操作
该方案不需要修改你现有初始化时的ArrayList实现,依靠ConcurrentHashMap的原子操作特性保证线程安全,compute方法执行重映射逻辑的全程会对对应key的节点加锁,同一时间只有一个线程能修改该key的映射值:
String targetUser = "user"; String needRemoveValue = "value1"; userValues.compute(targetUser, (key, valueList) -> { if (valueList != null) { valueList.remove(needRemoveValue); // 如果你希望列表删空后自动移除整个key,可以打开下面的注释 // if (valueList.isEmpty()) return null; } return valueList; });
方案2:初始化时使用线程安全的List实现
你可以在初始化列表时替换为线程安全的CopyOnWriteArrayList,后续直接操作列表的remove方法即可保证线程安全,适合读多写少的业务场景:
- 修改列表初始化逻辑:
ConcurrentHashMap<String, List<String>> userValues = new ConcurrentHashMap<>(); // 把原来的ArrayList替换为CopyOnWriteArrayList userValues.computeIfAbsent(user, key -> new CopyOnWriteArrayList<>()).add(value1); userValues.computeIfAbsent(user, key -> new CopyOnWriteArrayList<>()).add(value2); userValues.computeIfAbsent(user, key -> new CopyOnWriteArrayList<>()).add(value3); userValues.computeIfAbsent(user, key -> new CopyOnWriteArrayList<>()).add(value4);
- 后续删除单个值的逻辑:
List<String> userValueList = userValues.get("user"); if (userValueList != null) { userValueList.remove("value1"); }
内容的提问来源于stack exchange,提问作者user16807078
相关产品推荐
相关产品推荐

