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

给定 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);

    }

});


叮当猫咪
浏览 369回答 1
1回答

天涯尽头无女友

您forEach()不会自动发生,因为每个remove()调用都是独立同步的。您可以尝试通过创建新地图并用它替换旧地图来执行此操作:ConcurrentMap<String, String> newMap = new ConcurrentHashMap<>();newMap.put("session", this.map.get("session"));this.map = newMap;this.map在切换之前查看的线程将具有旧视图,但原子“删除”可以被认为是在您分配新地图时发生的。唯一的另一个问题是,当另一个线程修改"session"原始映射中第 2 行和第 3 行之间关联的值时(或者如果该键甚至不存在),但正如您在评论中所说,这永远不会发生。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java