Я знаю, что ConcurrentHashMap является поточно-безопасным, например, для параметра «Идентификатор», «Заменить» и т. Д., Но мне было интересно, это блок кода, подобный безопасному?Требуется ли синхронизация ConcurrentHashMap при увеличении ее значений?
if (accumulator.containsKey(key)) { //accumulator is a ConcurrentHashMap
accumulator.put(key, accumulator.get(key)+1);
} else {
accumulator.put(key, 0);
}
Имейте в виду, что значение аккумулятора для ключа может быть предложено два разных потоков одновременно, что может вызвать проблемы в нормальном HashMap. Так мне нужно что-то вроде этого?
ConcurrentHashMap<Integer,Object> locks;
...
locks.putIfAbsent(key,new Object());
synchronized(locks.get(key)) {
if (accumulator.containsKey(key)) {
accumulator.put(key, accumulator.get(key)+1);
} else {
accumulator.put(key, 0);
}
}
Спасибо за отличный ответ! Я возьму подход Java 8! Гораздо яснее! Кстати, это мой второй подход, защищенный потоками? Просто из любопытства! – syfantid
@Sofia отметим, что немного странно вставлять 0 в отсутствующий случай вместо 1, а если вы _did_ означают 1, возможно, было бы немного яснее написать 'accumulator.merge (key, 1, Integer :: сумма) '. –
@Sofia ваш второй подход ... возможно, работает, но это действительно неудобно и неэффективно, потому что вы вводите второй «ConcurrentHashMap», где его заполнение просто проще сделать потокобезопасным. –