关于Accumulator累加器 使用复杂表达式

来源:6-9 功能升级

技术进步官

2020-12-18

这是我运行的代码,当不是叠加或者叠乘的时候

public class Test10 {

    public static void main(String[] args) throws InterruptedException {
        LongAccumulator accumulator = new LongAccumulator((x, y) -> {
            long s = x + x * y;
            System.out.println(x + "+" + x + "*" + y + "=" + s);
            return s;
        }, 1);
        ExecutorService executor = Executors.newFixedThreadPool(8);
        IntStream.range(1, 10).forEach(i -> executor.submit(() -> accumulator.accumulate(i)));

        executor.shutdown();
        Thread.sleep(2000);
        System.out.println(accumulator.getThenReset());
    }

}

此时的运行结果:
图片描述

但是当我把表达式写成一行,就可以运行出固定结果

public class Test10 {

    public static void main(String[] args) throws InterruptedException {
        LongAccumulator accumulator = new LongAccumulator((x, y) -> {
            return x + x * y;
        }, 1);
        ExecutorService executor = Executors.newFixedThreadPool(8);
        IntStream.range(1, 10).forEach(i -> executor.submit(() -> accumulator.accumulate(i)));

        executor.shutdown();
        Thread.sleep(1000);
        System.out.println(accumulator.getThenReset());
    }

}

图片描述

所以在方法只写一行运行语句的时候,是会顺序运行吗?

写回答

1回答

技术进步官

提问者

2020-12-18

想明白了,是因为并发操作线程只要保证x和y是当前操作之后x的值不允许改变,只写一行语句的时候,是因为运行速度非常快,所以会有固定的结果出现。

0
0

深度解密Java并发工具,精通JUC,成为并发多面手

JUC全方位讲解,构建并发工具类知识体系

1599 学习 · 573 问题

查看课程