MBZ*_*MBZ 10 java concurrency map
我正在尝试创建一个Map带有int值并通过多个线程增加它们.两个或多个线程可能会增加相同的密钥.
ConcurrentHashMap 文档对我来说非常不清楚,因为它表明:
Retrieval operations (including get) generally do not block, so may overlap with update operations (including put and remove)
我想知道以下代码使用ConcurrentHashMap是否正常:
myMap.put(X, myMap.get(X) + 1);
如果没有,我该怎么办呢?
Pav*_*nek 10
并发映射不会帮助您的代码的线程安全.你仍然可以得到比赛条件:
Thread-1: x = 1, get(x)
Thread-2: x = 1, get(x)
Thread-1: put(x + 1) => 2
Thread-2: put(x + 1) => 2
Run Code Online (Sandbox Code Playgroud)
发生了两次增量,但你仍然只获得+1.只有当您的目标是修改地图本身而不是其内容时,才需要并发地图.即使最简单的HashMap也是并发读取的线程安全,因为地图不再变异.
因此,不需要基本类型的线程安全映射,您需要该类型的线程安全包装器.java.util.concurrent.atomic如果需要任意类型,可以使用或滚动自己的锁定容器.