java - AtomicInteger.updateAndGet() 和 AtomicInteger.accumulateAndGet() 之间在功能上有什么区别吗?

标签 java lambda java-8 atomic atomicinteger

有没有AtomicInteger.accumulateAndGet()不能用AtomicInteger.updateAndGet()代替的场景,还是只是为了方便方法引用?

这是一个简单的示例,我没有看到任何功能差异:

AtomicInteger i = new AtomicInteger();
i.accumulateAndGet(5, Math::max);
i.updateAndGet(x -> Math.max(x, 5));

显然,getAndUpdate()getAndAccumulate() 也是如此。

最佳答案

如有疑问,您可以查看implementation :

public final int accumulateAndGet(int x,
                                  IntBinaryOperator accumulatorFunction) {
    int prev, next;
    do {
        prev = get();
        next = accumulatorFunction.applyAsInt(prev, x);
    } while (!compareAndSet(prev, next));
    return next;
}

public final int updateAndGet(IntUnaryOperator updateFunction) {
    int prev, next;
    do {
        prev = get();
        next = updateFunction.applyAsInt(prev);
    } while (!compareAndSet(prev, next));
    return next;
}

它们仅在一行中有所不同,显然 accumulateAndGet 可以通过 updateAndGet 轻松表达:

public final int accumulateAndGet(int x,
                                  IntBinaryOperator accumulatorFunction) {
    return updateAndGet(prev -> accumulatorFunction.applyAsInt(prev, x));
}

所以 updateAndGet 是更基本的操作,而 accumulateAndGet 是一个有用的快捷方式。如果您的 x 不是有效的 final,这种快捷方式可能特别有用:

int nextValue = 5;
if(something) nextValue = 6;
i.accumulateAndGet(nextValue, Math::max);
// i.updateAndGet(prev -> Math.max(prev, nextValue)); -- will not work

关于java - AtomicInteger.updateAndGet() 和 AtomicInteger.accumulateAndGet() 之间在功能上有什么区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36022739/

相关文章:

java - 从 toplink/eclipselink equalOuterJoin 迁移到 Hibernate Criteria

Java获取文本文件的属性

linq - 如何使用 Lambda 表达式加入 LINQ 并在 DTO 中获取结果?

c# - 如何有效地限制然后将结果与 linq/lambda 表达式连接?

java - 使用 Java 8 实现递归 lambda 函数

java - 如何使用反射来获取对可以传递的 lambda 的引用?

java - 允许jar中的两个库使用依赖java的两个不同版本

spring - 获取java.lang.IllegalStateException:使用Springs运行Cucumber测试时无法加载CacheAwareContextLoaderDelegate异常

java - 构造函数引用不正确在 IntelliJ 2017.1.4 中标记为错误

java - 如何回收Java线程堆栈使用的内存?