根据我的理解,ConcurrentHashMap将允许多个线程在同一散列映射上读写(添加/删除),而不会出现并发散列映射异常。正在使用同步哈希映射的同步块是否正确?
我有4个线程,每个线程可以更新散列表。我不希望其他线程在当前线程正在更新时在hashmap上写/更新。
ConcurrentHashMap<String, Integer> playerLoginCounterHashMap = new ConcurrentHashMap<>();
ExecutorService executorService = Executors.newFixedThreadPool(4);
for (int i = 0; i < 4; i++) {
executorService.submit(new Runnable() {
@Override
public void run() {
synchronized (playerLoginCounterHashMap) {
if (playerLoginCounterHashMap.get("testPlayer") == null) {
playerLoginCounterHashMap.put("testPlayer", 1);
} else {
playerLoginCounterHashMap.put("testPlayer", playerLoginCounterHashMap.get("testPlayer").intValue() + 1);
}
}
}
});
}
这是正确的做法吗?没有同步块我得到的值是不正确的。
该代码为您生成一个异常? –
您需要使用'putIfAbsent'或'computeIfAbsent'等并发感知API来允许并发。否则,如果您的整个更新过程需要是原子的,那么唯一的解决方案就是在更新时锁定并阻止任何其他线程使用映射,此时ConcurrentHashMap不会为您添加任何值。 –
@DanielPryden putIfAbsent,虽然 –