LongAccumulator
是LongAdder
的更通用的版本。LongAccumulator
以类型为LongBinaryOperator
lambda表达式构建,而不是仅仅执行加法操作,像这段代码展示的那样:
LongBinaryOperator op = (x, y) -> 2 * x + y;
LongAccumulator accumulator = new LongAccumulator(op, 1L);
ExecutorService executor = Executors.newFixedThreadPool(2);
IntStream.range(0, 10)
.forEach(i -> executor.submit(() -> accumulator.accumulate(i)));
stop(executor);
System.out.println(accumulator.getThenReset()); // => 2539
我们使用函数2 * x + y
创建了LongAccumulator
,初始值为1。每次调用accumulate(i)
的时候,当前结果和值i
都会作为参数传入lambda表达式。
LongAccumulator
就像LongAdder
那样,在内部维护一系列变量来减少线程之间的争用。