给定 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 行之间关联的值时(或者如果该键甚至不存在),但正如您在评论中所说,这永远不会发生。
添加回答
举报
0/150
提交
取消