我正在尝试使用 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 。即使是最简单的HashMap是threadsafe for concurrent reads ,假设 map 不再发生变化。
因此,您需要该类型的线程安全包装器,而不是基本类型的线程安全映射。来自 java.util.concurrent.atomic
的内容,或者如果需要任意类型,则滚动您自己的锁定容器。
关于java map并发更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12141292/