【发布时间】:2019-12-26 21:05:13
【问题描述】:
我想有几个柜台,我可以按名称寻址。所以,我可以这样实现:
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.computeIfAbsent("key", k -> new Integer(0));
map.computeIfPresent("key", (k, v) -> v + 1);
它的代码是线程安全的吗?
我是这么认为的,因为ConcurrentHashMap 我们有同步访问,并且设置新的引用也是线程安全的操作。由于安全发布,其他线程会看到这种变化,当我们将存储桶锁留在ConcurrentHashMap 时会发生这种情况。
【问题讨论】:
-
您不妨使用
AtomicInteger。 (另外,Integer.valueOf。) -
@TomHawtin-tackline 是的,我可以使用它。但我只是想知道,我可以为此目的使用 Integer。
-
这两个单独的语句是线程安全的,但它们在一起并不是因为你有 2 个调用并且这 2 个调用一起不是原子的。如果您想要这 2 个电话,只需使用
compute并在BiFunction中处理这两种情况。另请查看Map::merge方法 - 这也可能满足您的要求 -
@michalk hm,但我不需要 2 个操作的原子性。如果多个线程创建计数器,只有一个会成功。
-
您可以放心地将
new Integer(0)替换为0- 自动装箱会为您解决问题
标签: java multithreading java-8 concurrency concurrenthashmap