gpt4 book ai didi

java - Java同步HashMap中的size()、put()、remove()、get()是原子的吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:02:29 24 4
gpt4 key购买 nike

我将 Java Map 声明为

Map<String, String> map = Collections.synchronizedMap(new HashMap<String, String>());

处理并发问题,对 map 上的所有操作进行同步。但是,我读到当操作是原子操作时,同步在 synchronizedMap 上不是必需的。我检查了 Java API,HashMap 的文档似乎没有提到哪些是原子的,所以我不确定哪些是原子的。

我正在同步对 map 的以下调用:

map.size()

map.put()

map.remove()

map.get()

但是如果有些是原子的,那么似乎不需要同步。哪些是原子的?

最佳答案

同步 map 顾名思义就是同步的。其上的每个操作相对于其上的任何其他操作都是原子的。

您可以将其视为同步映射的每个方法都使用 synchronized 关键字声明。

请记住,虽然单个操作是原子的,但如果将它们组合起来,它们就不再是原子的,例如:

String value = map.get("key");
map.put("key", value+"2");

不等同于您的自定义同步代码:

synchronized (map) {
String value = map.get("key");
map.put("key", value+"2");
}

而是:

synchronized (map) {
String value = map.get("key");
}
synchronized (map) {
map.put("key", value+"2");
}

关于java - Java同步HashMap中的size()、put()、remove()、get()是原子的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24540610/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com