1.原子值
java5开始,提供了一些原子操作的类,如AtomicInteger、AtomicLong等
这些类提供了诸如incrementAndGet这样的原子操作方法。
单数如果想进行复杂操作,则需要使用compareAndSet进行循环处理
do {
// .. 计算
} while (!atomicLong.compareAndSet(old, new));
在java8中提供了updateAndGet和accumulateAndGet方法
atomicLong,updateAndGet(x -> Max.max(x, observed));
atomicLong.accumulateAndGet(observed, Math::max);
同时也提供了返回原始值的对应方法:getAndUpdate、getAndAccumulate
------------------------------------------------------
当大量线程访问同一个原始值时,由于乐观锁重试次数太多会导致性能下降
Java8为此提供了LongAdder和LongAccumulator解决该问题
其思想为将初始值变为多个中立元素,计算时不同线程可以对不同元素进行操作,最后再将操作结果合并。
例如:
LongAccumulator adder = new LongAccumulator (Long::sum, 0);
adder.accumulate(value);
此时在LongAccumulator 中包含多个中立元素a1,a2...aN.该例子下中立元素初始值都为零。当调用accumulate方法累加value时,这些变量的其中之一