java - 我可以将ConcurrentHashMap与Integer一起用于线程安全计数器吗?

标签 java multithreading java-8 concurrency concurrenthashmap

我想有几个柜台,我可以按名称处理。因此,我可以通过以下方式实现它:

ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.computeIfAbsent("key", k -> new Integer(0));
map.computeIfPresent("key", (k, v) -> v + 1);

它是代码安全的线程吗?

我想是这样,因为由于ConcurrentHashMap,我们已经进行了同步访问,并且设置新的引用也是线程安全的操作。由于安全发布,其他线程将看到这种变化,这是在我们将桶锁保留在ConcurrentHashMap中时发生的。

最佳答案

假设第一个语句map.computeIfAbsent("key", k -> new Integer(0));发生在“初始化时间”,然后有一堆线程执行map.computeIfPresent("key", (k, v) -> v + 1);形式的调用,是的,该算法将是正确的(我是否很好地理解了你的意图?)。

JDK的最新版本保证对ConcurrentHashMap.computeIfPresent()的调用不仅会调用以线程安全的方式传递的表达式,而且还可以保证,如果其他线程尝试同时作用于相同的键,它们将被阻塞并排入队列,以便所有突变都按顺序发生(在分布式系统中,这称为可序列化性)。

关于java - 我可以将ConcurrentHashMap与Integer一起用于线程安全计数器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59493461/

相关文章:

java - @Transactional 在 CDI Bean 的基类中被忽略

c# - 如何从 Task.Factory.StartNew<> 获取结果?

c++ - 如何将 vector (或不同的容器)与不可复制的类一起使用?

java - 并发测试: test case scenario automatization

java-8 - 为什么 Map<K,V> 不扩展 Function<K,V>?

java - 如何定义自定义组合谓词?

java - 在 Java 中创建元组和元组函数的辅助方法?

java - 以编程方式将 csv 映射到 smooks 中的 java 无法处理空的 Double

java - GWT 应用程序的最佳架构

java - JodaTime DateTime,ISO8601 GMT 日期格式