Может быть немного поздно, но вот мои два цента.
Если вы используете Java 8, то вы можете использовать метод computeIfPresent .Если значение для указанного ключа присутствует и не равно нулю, то оно пытается вычислить новое сопоставление, учитывая ключ и его текущее сопоставленное значение.
final Map<String,Integer> map1 = new HashMap<>();
map1.put("A",0);
map1.put("B",0);
map1.computeIfPresent("B",(k,v)->v+1); //[A=0, B=1]
Мы также можем использовать другой метод putIfAbsent чтобы поставить ключ.Если указанный ключ еще не связан со значением (или сопоставлен со значением NULL), этот метод связывает его с данным значением и возвращает значение NULL, в противном случае возвращается текущее значение.
В случае, если карта используется совместнотогда мы можем использовать ConcurrentHashMap
и AtomicInteger .Из документа:
AtomicInteger
- это значение типа int, которое может быть обновлено атомарно.AtomicInteger используется в приложениях, таких как счетчики с атомным приращением, и не может использоваться в качестве замены для Integer.Однако этот класс расширяет Number, чтобы обеспечить единообразный доступ инструментам и утилитам, которые работают с классами на основе чисел.
Мы можем использовать их, как показано ниже:
final Map<String,AtomicInteger> map2 = new ConcurrentHashMap<>();
map2.putIfAbsent("A",new AtomicInteger(0));
map2.putIfAbsent("B",new AtomicInteger(0)); //[A=0, B=0]
map2.get("B").incrementAndGet(); //[A=0, B=1]
Одна точкачтобы наблюдать, мы вызываем get
, чтобы получить значение для ключа B
, а затем вызываем incrementAndGet()
для его значения, которое, конечно, AtomicInteger
.Мы можем оптимизировать его, так как метод putIfAbsent
возвращает значение для ключа, если он уже существует:
map2.putIfAbsent("B",new AtomicInteger(0)).incrementAndGet();//[A=0, B=2]
На заметку, если мы планируем использовать AtomicLong , то в соответствии с документациейожидаемая пропускная способность при высокой конкуренции LongAdder значительно выше за счет более высокого потребления пространства.Также проверьте этот вопрос .