У меня есть ConcurrentMap
, который мне нужно заполнить из многопоточного приложения. Моя карта приведена ниже:Как атомно обновить значение ConcurrentMap в многопоточном приложении?
private final ConcurrentMap<String, AtomicLongMap<String>> deviceErrorHolder = Maps.newConcurrentMap();
Ниже мой метод, который вызывается из многопоточного приложения в очень быстром темпе, поэтому мне нужно, чтобы убедиться, что это быстро.
public void addDeviceErrorStats(String deviceName, String errorName) {
AtomicLongMap<String> errorMap = deviceErrorHolder.get(deviceName);
if (errorMap == null) {
errorMap = AtomicLongMap.create();
AtomicLongMap<String> currenttErrorMap = deviceErrorHolder.putIfAbsent(deviceName, errorMap);
if (currenttErrorMap != null) {
errorMap = currenttErrorMap;
}
}
errorMap.incrementAndGet(errorName);
}
Для каждого deviceName
, у меня будет AtomicLongMap
, который будет содержать все счетчики для различных errorName
.
ExceptionCounter.getInstance().addDeviceErrorStats("deviceA", "errorA");
ExceptionCounter.getInstance().addDeviceErrorStats("deviceA", "errorB");
ExceptionCounter.getInstance().addDeviceErrorStats("deviceA", "errorC");
ExceptionCounter.getInstance().addDeviceErrorStats("deviceB", "errorA");
ExceptionCounter.getInstance().addDeviceErrorStats("deviceB", "errorB");
Is my addDeviceErrorStats
метод потокобезопасный? А также способ корректировки значения моей deviceErrorHolder
карты верны? Это будет атомная операция? Нужно ли мне синхронизировать создание новых экземпляров AtomicLongMap
? Или CM позаботится обо мне?
Я работаю с Java7.
Почему вы не пишете тестовый файл, чтобы сгенерировать сценарий и поделиться результатами: D –
Вам нужно computeIfAbsent, чтобы сделать его потокобезопасным. –
Я все еще на Java 7, поэтому не могу использовать 'computeIfAbsent' –