Следуя по этому вопросу (Java thread safety - multiple atomic operations?), я не хочу, чтобы добавить больше вопросов к нему, но теперь у меня есть это сомнение:Java CHM синхронизации
private final Map<String, Set<String>> data = Maps.newConcurrentMap();
... then in a method ...
if (data.containsKey("A")) {
data.get("A").add("B");
}
Это должно быть что-то вроде этого:
synchronized(data) {
if (data.containsKey("A")) {
data.get("A").add("B");
}
}
Для того, чтобы быть потокобезопасным. Это верно?
Так что операции являются атомарными, но для их объединения потребуется синхронизация, верно? В этот момент было бы целесообразно просто использовать простой HashMap вместо параллельного, поскольку мы вручную обрабатываем синхронизацию?
Есть ли какой-либо метод в CHM, чтобы сделать эту работу атомарно?
Одним из преимуществ над простым HashMap является то, что CHM по-прежнему не требует синхронизации для считывателей. – Thilo
Просьба также показать код, который изменяет CHM. Вышеприведенный код доступен только для чтения (только вызывает 'get' и' containsKey') в отношении карты. – Thilo
@Thilo просто представьте, что метод 'put' используется несколькими потоками. Во всяком случае, меня интересует, нужно ли мне «синхронизироваться», чтобы сделать его потокобезопасным. Кроме того, если есть какая-либо конструкция в CHM, чтобы помочь мне избежать этой синхронизации и сделать «map.addValueIfKeyPresent» (я знаю, что этого метода не существует) – Will