Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中使用LongAdder_Java_Multithreading - Fatal编程技术网

在Java中使用LongAdder

在Java中使用LongAdder,java,multithreading,Java,Multithreading,我正在读Cay S.Horstmann写的《核心Java I》,在第580页,他提到了LongAdder: public long sum() { Cell[] cs = cells; long sum = base; if (cs != null) { for (Cell c : cs) if (c != null) sum += c.value;

我正在读Cay S.Horstmann写的《核心Java I》,在第580页,他提到了LongAdder:

 public long sum() {
        Cell[] cs = cells;
        long sum = base;
        if (cs != null) {
            for (Cell c : cs)
                if (c != null)
                    sum += c.value;
        }
        return sum;
    }
如果您预计会出现高争用[*1],则只需使用长加法器而不是 原子长。方法名称略有不同。调用increment以递增计数器 或“添加”以添加数量,然后“求和”以检索总数

注 当然,增量方法不会返回旧的[*2]值。那样做会使你失败 将总和拆分为多个总和的效率增益

在[*1]中,“争用”一词的意思是,在机器的第二部分,有大量线程运行java代码

在[*2]中,他提到了旧价值观。在这种情况下,旧的和新的价值是什么?请您简单解释一下。

[*1]:多线程上下文中的术语“争用”意味着许多线程试图同时访问/调用/更新某些内容;在这种情况下,通常使用
长加法器
或计数器

[*2]:此上下文中的旧值是
LongAdder
的前一个值。当
AtomicLong
的所有更新方法(除了
set
和一些CAS方法)返回之前存储的值时,
LongAdder#increment
返回
void
。新值就是。。新值,您可以通过
sum
获得的值


LongAdder
的工作方式不同于
AtomicLong
以提高吞吐量,这就是为什么例如
increment
不返回任何内容。您可以在这里阅读:

长加法器不维护一个值。当您递增/添加新值时,它会在不同的单元格中存储1或新值。它不保持总价值

当您想要得到实际值时,可以调用sum()方法,该方法将所有值相加以得到结果

为了更好地理解,下面介绍如何在LongAdder中实现sum方法:

 public long sum() {
        Cell[] cs = cells;
        long sum = base;
        if (cs != null) {
            for (Cell c : cs)
                if (c != null)
                    sum += c.value;
        }
        return sum;
    }