ConcurrentHashMap 原子操作以删除除一个条目之外的所有条目
ConcurrentHashMap atomic operation to remove all entries except one
假设 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
在切换之前将具有旧视图,但是原子 "removal" 可以被认为是在您分配新地图时发生的。唯一的另一个问题是当另一个线程在第 2 行和第 3 行之间的原始映射中修改与 "session"
关联的值时(或者如果该键甚至不存在),但正如您在 中所说那永远不会发生。
假设 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
在切换之前将具有旧视图,但是原子 "removal" 可以被认为是在您分配新地图时发生的。唯一的另一个问题是当另一个线程在第 2 行和第 3 行之间的原始映射中修改与 "session"
关联的值时(或者如果该键甚至不存在),但正如您在