在Java中使用LongAdder
我正在读Cay S.Horstmann写的《核心Java I》,在第580页,他提到了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;
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;
}