モジュール java.base

クラスLongAccumulator

java.lang.Object
java.lang.Number
java.util.concurrent.atomic.LongAccumulator
すべての実装されたインタフェース:
Serializable

public class LongAccumulator extends Number implements Serializable
指定された関数を使用して更新される処理中のlong値を一緒に保持する1つ以上の変数。 更新(メソッドaccumulate(long))がスレッド間で競合すると、競合を減らすために変数セットが動的に拡大する場合があります。 メソッドget() (または、等価のlongValue())は、更新を保持している変数にまたがる現在の値を返します。

きめ細かい同期制御のためではなく統計収集などの目的に使用される共通の値が、複数のスレッドによって更新される場合、通常はAtomicLongよりもこのクラスをお薦めします。 更新の競合が少ないときは、2つのクラスの特徴は似ています。 競合が多いときは、期待されるスループットはこのクラスの方がかなり高くなります。ただし、容量消費も多くなります。

スレッド内またはスレッド間での累積の順序は保証されていないため、それに依存することはできません。したがって、累積の順序が重要でない関数に対してのみ、このクラスを適用できます。 指定されたアキュムレータ関数は、試行した更新がスレッド間の競合のため失敗したときに再度適用される可能性があるため、副作用を持つべきではありません。 予測可能な結果のためには、アキュムレータ関数は連想的かつ可換でなければなりません。 この関数は、既存の値(または同一性)を1つの引数として、与えられた更新をもう1つの引数として適用します。 たとえば、処理中の最大値を保持するために、 Long::maxとともにLong.MIN_VALUEを単位元として指定することができます。

クラスLongAdderは、このクラスの機能に似た、カウントと合計を保持するという共通の特殊ケースのための機能を提供します。 new LongAdder()呼出しはnew LongAccumulator((x, y) -> x + y, 0L)と等価です。

このクラスはNumberを拡張しますが、equalshashCode compareToなどのメソッドを定義しません。インスタンスでは変更が想定されているため、コレクション・キーとしては役立たないからです。

導入されたバージョン:
1.8
関連項目: