java map并发更新

标签 java concurrency map

我正在尝试使用 int 值创建一个 Map 并通过多个线程增加它们。两个或更多线程可能会增加相同的 key 。

ConcurrentHashMap 文档对我来说非常不清楚,因为它说:

检索操作(包括 get)一般不会阻塞,因此可能与更新操作(包括 put 和 remove)重叠

我想知道以下使用 ConcurrentHashMap 的代码是否能正确:

myMap.put(X, myMap.get(X) + 1);

如果没有,我该如何管理这样的事情?

最佳答案

并发映射无助于代码的线程安全。你仍然可以获得竞争条件:

Thread-1: x = 1, get(x)
Thread-2: x = 1, get(x)
Thread-1: put(x + 1) => 2
Thread-2: put(x + 1) => 2

发生了两次增量,但您仍然只得到 +1。仅当您打算修改 map 本身而不是其内容时,才需要并发 map 。即使是最简单的HashMapthreadsafe for concurrent reads ,假设 map 不再发生变化。

因此,您需要该类型的线程安全包装器,而不是基本类型的线程安全映射。来自 java.util.concurrent.atomic 的内容,或者如果需要任意类型,则滚动您自己的锁定容器。

关于java map并发更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12141292/

相关文章:

java - 如何使用java从outlook打开附加文档?

java - 如何使我的java代码能够与许多数据库和许多操作系统一起工作?

java - 错误 - java.sql.Timestamp 无法转换为 JFreeChart 中的 java.sql.Date

java - 是否有旨在调试并发软件的 JVM?

python - 用于在城市 map 上绘制点的好 python 工具包?

java - 使用 JavaFX 模型的 QueryDSL

C# 数据库应用并发

java - Java中如何异步调用方法

java - Map<?, ?> 在 Java 中是什么意思?

java - Freemarker:如何使用枚举作为键来遍历 map