我正在尝试用int值创建一个Map,并通过多个线程增加它们.两个或多个线程可能会增加相同的密钥.
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.只有当您要修改地图本身而不是其内容时,才需要并发地图.即使是最简单的HashMap是threadsafe for concurrent reads,给定地图不再突变了.
因此,您不需要为原始类型提供线程安全的映射,因此您需要该类型的线程安全包装.从java.util.concurrent.atomic中的任何东西,或者如果需要任意类型,请滚动自己的锁定的容器.