ConcurrentHashMap原子操作,用于删除除一个条目外的所有条目



给定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"相关的值时(或者如果该键甚至不存在(,但正如您在评论中所说,这种情况从未发生过。

相关内容

最新更新