Module java.base

Class LongAccumulator

java.lang.Object
java.lang.Number
java.util.concurrent.atomic.LongAccumulator
所有已实现的接口:
Serializable

public class LongAccumulator extends Number implements Serializable
一个或多个变量一起维护一个使用提供的函数更新的运行中的long值。当跨线程争用更新(方法accumulate(long))时,变量集可能会动态增长以减少争用。方法get()(或等效地,longValue())返回维护更新的变量之间的当前值。

当多个线程更新用于收集统计信息等目的的共同值时,通常应优先使用此类,而不是AtomicLong用于细粒度同步控制。在低更新争用下,这两个类具有类似的特性。但在高争用下,此类的预期吞吐量显著更高,代价是更高的空间消耗。

在线程内或跨线程的累积顺序不能保证,也不能依赖,因此此类仅适用于累积顺序无关紧要的函数。提供的累加器函数应是无副作用的,因为当尝试更新由于线程之间的争用而失败时,可能会重新应用该函数。为了获得可预测的结果,累加器函数应是可结合和可交换的。该函数应用现有值(或标识)作为一个参数,给定的更新作为另一个参数。例如,为了维护一个运行的最大值,您可以提供 Long::max以及Long.MIN_VALUE作为标识。

LongAdder提供了此类功能的类似功能,用于维护计数和总和的常见特殊情况。调用new LongAdder()等效于new LongAccumulator((x, y) -> x + y, 0L)

此类扩展了Number,但不定义诸如equalshashCodecompareTo等方法,因为预计实例将被改变,因此作为集合键是没有用的。

自Java版本:
1.8
参见:
  • Constructor Details

    • LongAccumulator

      public LongAccumulator(LongBinaryOperator accumulatorFunction, long identity)
      使用给定的累加器函数和标识元素创建一个新实例。
      参数:
      accumulatorFunction - 两个参数的无副作用函数
      identity - 累加器函数的标识(初始值)
  • Method Details

    • accumulate

      public void accumulate(long x)
      使用给定值更新。
      参数:
      x - 值
    • get

      public long get()
      返回当前值。返回的值不是原子快照;在没有并发更新的情况下调用将返回准确的结果,但在计算值时发生并发更新可能不会被合并。
      返回:
      当前值
    • reset

      public void reset()
      将维护更新的变量重置为标识值。此方法可能是创建新更新器的有用替代方法,但仅在没有并发更新时有效。因为此方法本质上是竞争的,所以只有在已知没有线程同时更新时才应使用。
    • getThenReset

      public long getThenReset()
      等效于get()后跟reset()。例如,在多线程计算之间的静止点期间可能应用此方法。如果有与此方法并发的更新,返回的值不保证是重置之前发生的最终值。
      返回:
      重置前的值
    • toString

      public String toString()
      返回当前值的字符串表示形式。
      覆盖:
      toString 在类 Object
      返回:
      当前值的字符串表示形式
    • longValue

      public long longValue()
      等效于get()
      指定:
      longValue 在类 Number
      返回:
      当前值
    • intValue

      public int intValue()
      返回通过缩小原始转换为int后的当前值
      指定:
      intValue 在类 Number
      返回:
      转换为int类型后此对象表示的数值。
    • floatValue

      public float floatValue()
      返回通过扩展原始转换为float后的当前值
      指定:
      floatValue 在类 Number
      返回:
      转换为float类型后此对象表示的数值。
    • doubleValue

      public double doubleValue()
      返回通过扩展原始转换为double后的当前值
      指定:
      doubleValue 在类 Number
      返回:
      转换为double类型后此对象表示的数值。