You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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方法即可保证线程安全,适合读多写少的业务场景:

  1. 修改列表初始化逻辑:
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);
  1. 后续删除单个值的逻辑:
List<String> userValueList = userValues.get("user");
if (userValueList != null) {
    userValueList.remove("value1");
}

内容的提问来源于stack exchange,提问作者user16807078

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 17:06:05