Module java.base

Class DoubleAccumulator

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

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

当多个线程更新用于诸如频繁更新但较少频繁读取的摘要统计等目的的共同值时,通常应优先使用此类。

提供的累加器函数应是无副作用的,因为当尝试更新由于线程之间的争用而失败时,可能会重新应用该函数。为了获得可预测的结果,在使用上下文中所需的浮点容差内,累加器函数应在浮点容差内是可交换和可结合的。该函数应用现有值(或标识)作为一个参数,给定的更新作为另一个参数。例如,为了维护一个运行的最大值,您可以提供Double::max以及Double.NEGATIVE_INFINITY作为标识。在线程内或跨线程内的累积顺序不被保证。因此,如果需要数值稳定性,特别是在结合数量级差异很大的值时,此类可能不适用。

DoubleAdder为维护总和的常见特殊情况提供了此类功能的类似物。调用new DoubleAdder()等效于new DoubleAccumulator((x, y) -> x + y, 0.0)

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

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

    • DoubleAccumulator

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

    • accumulate

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

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

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

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

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

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

      public long longValue()
      返回当前值作为一个long,经过缩小的原始转换。
      指定者:
      longValue 在类 Number
      返回:
      在转换为long类型后表示的数值。
    • intValue

      public int intValue()
      返回当前值作为一个int,经过缩小的原始转换。
      指定者:
      intValue 在类 Number
      返回:
      在转换为int类型后表示的数值。
    • floatValue

      public float floatValue()
      返回当前值作为一个float,经过缩小的原始转换。
      指定者:
      floatValue 在类 Number
      返回:
      在转换为float类型后表示的数值。