给定ConcurrentHashMap<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);
}
});
您的forEach()
不会以原子方式发生,因为每个remove()
调用都是独立同步的。
你可以通过创建一个新地图并用它替换旧地图来尝试这样做:
ConcurrentMap<String, String> newMap = new ConcurrentHashMap<>();
newMap.put("session", this.map.get("session"));
this.map = newMap;
在切换之前查看this.map
的线程将具有旧视图,但原子"移除"可以被认为是在分配新映射时发生的。唯一的另一个问题是,当另一个线程在第2行和第3行之间修改原始映射中与"session"
相关的值时(或者如果该键甚至不存在(,但正如您在评论中所说,这种情况从未发生过。