私の理解しているように、ConcurrentHashMapは、同時ハッシュマップ例外を取得することなく、複数のスレッドが同じハッシュマップ上で読み書きできるようにします(追加/削除)。同時ハッシュマップの同期ブロックを使用していますか?
私は4つのスレッドを持ち、各スレッドはハッシュマップを更新できます。私は、現在のスレッドがそれを更新している間に他のスレッドがハッシュマップに書き込み/更新しないようにします。
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は、docからのcomputeIfAbsentのようなものではないようですが、 –