为了账号安全,请及时绑定邮箱和手机立即绑定

ConcurrentHashMap 原子操作删除除一个之外的所有条目

ConcurrentHashMap 原子操作删除除一个之外的所有条目

叮当猫咪 2022-01-12 09:59:28
给定 aConcurrentHashMap<String, String>包含以下条目:this.map = new ConcurrentHashMap<>();this.map.put("user", "user description");this.map.put("session", "session description");this.map.put("test", "test description");该映射由多个线程访问。如何删除所有键,除了session以原子方式?如果没有竞争条件,这段代码会按我的预期工作吗?forEach方法是原子的吗?有没有其他方法可以原子地实现这一目标?map.forEach((key, value) -> {    if (!key.equals("session")) {        map.remove(key);    }});
查看完整描述

1 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

您forEach()不会自动发生,因为每个remove()调用都是独立同步的。


您可以尝试通过创建新地图并用它替换旧地图来执行此操作:


ConcurrentMap<String, String> newMap = new ConcurrentHashMap<>();

newMap.put("session", this.map.get("session"));

this.map = newMap;

this.map在切换之前查看的线程将具有旧视图,但原子“删除”可以被认为是在您分配新地图时发生的。唯一的另一个问题是,当另一个线程修改"session"原始映射中第 2 行和第 3 行之间关联的值时(或者如果该键甚至不存在),但正如您在评论中所说,这永远不会发生。


查看完整回答
反对 回复 2022-01-12
  • 1 回答
  • 0 关注
  • 343 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信