В Java 8 представлено множество улучшений, таких как Stamped Locks Locks, Parallel Sorting Long or Double Adder and Long or Double Accumulator, а также множество улучшений.

LongAdder и LongAccumators, которые присутствовали в java.util.concurrent.atomic.

LongAdder и LongAccumators, которые рекомендуются вместо классов Atomic, когда несколько потоков часто обновляются и реже читаются. Во время высокой конкуренции они были разработаны таким образом, чтобы они могли динамично расти.

Атомные классы (AtomicLong или AtomicDouble) внутренне используют изменчивую переменную, поэтому для любой операции данные должны извлекаться из памяти, что требует много циклов ЦП, в условиях сильной конкуренции многие циклы ЦП тратятся впустую.

Таким образом, LongAdder и LongAccumator разработаны таким образом, что они используют свои локальные значения для каждого потока и, наконец, могут суммировать все значения. Внутри они используют массив объектов ячеек, который может увеличиваться по требованию, где хранится значение. Чем больше потоков вызывает increment(), тем длиннее будет массив. Каждая запись в массиве может обновляться отдельно.

В приведенном ниже коде показано, как можно использовать LongAdder для вычисления суммы нескольких значений:

LongAdder counter = new LongAdder();
ExecutorService service = Executors.newFixedThreadPools(4);
Runnable incrementTask = () -> {
  counter.increment()  ;
};
for (int i = 0; i < 4; i++) {
          executorService.execute(incrementTask);
}
// get the current sum
long sum = counter.sum();

Результат счетчика в LongAdder недоступен, пока мы не вызовем метод sum(). Этот метод перебирает массив ячеек и суммирует все значения.

Класс-сумматор используется для суммирования или добавления значения, тогда как классы Накопитель получают коммутативную функцию для объединения значений или выполнения некоторых действий. .

В приведенном ниже коде показано, как можно использовать LongAccumulator для вычисления суммы нескольких значений:

LongAccumulator acc = new LongAccumulator(Long::sum, 0);
ExecutorService service = Executors.newFixedThreadPools(4);
Runnable incrementTask = () -> {
  acc.accumulate()  ;
};
for (int i = 0; i < 4; i++) {
          executorService.execute(incrementTask);
}
// get the current sum
long sum = acc.get();

Здесь мы передали функцию суммы функции накопления класса Long, которая вызовет нашу сумму в функцию.

Эти реализации классов являются очень умными реализациями в java8, они экономят много циклов процессора и увеличивают общую скорость выполнения процесса.