- java.lang.Object
-
- java.util.concurrent.atomic.AtomicReferenceFieldUpdater<T,V>
-
- 型パラメータ:
T
- 更新可能なフィールドを保持するオブジェクトの型V
- フィールドの型
public abstract class AtomicReferenceFieldUpdater<T,V> extends Object
指定されたクラスの指定されたvolatile
参照フィールドの原子更新が可能な、リフレクション・ベースのユーティリティです。 このクラスは、同一ノードの複数の参照フィールドが独立して原子更新の対象になる原子データ構造での使用を念頭に置いて設計されています。 たとえば、ツリー・ノードは次のように宣言されます。class Node { private volatile Node left, right; private static final AtomicReferenceFieldUpdater<Node, Node> leftUpdater = AtomicReferenceFieldUpdater.newUpdater(Node.class, Node.class, "left"); private static AtomicReferenceFieldUpdater<Node, Node> rightUpdater = AtomicReferenceFieldUpdater.newUpdater(Node.class, Node.class, "right"); Node getLeft() { return left; } boolean compareAndSetLeft(Node expect, Node update) { return leftUpdater.compareAndSet(this, expect, update); } // ... and so on }
このクラス内の
compareAndSet
メソッドの保証は、ほかの原子クラス内のそれよりも弱いことに留意してください。 このクラスは、フィールドの使用すべてが原子アクセスに適していることを保証できないため、同じアップデータでのcompareAndSet
およびset
のほかの呼出しに関してのみ原子性を保証できます。newUpdater(java.lang.Class<U>, java.lang.Class<W>, java.lang.String)
に渡されたクラスのインスタンスでない型T
のパラメータのオブジェクト引数がスローされClassCastException
になります。- 導入されたバージョン:
- 1.5
-
-
コンストラクタのサマリー
コンストラクタ 修飾子 コンストラクタ 説明 protected
AtomicReferenceFieldUpdater()
サブクラスにより使用される、何も行わないprotectedコンストラクタ。
-
メソッドのサマリー
修飾子と型 メソッド 説明 V
accumulateAndGet(T obj, V x, BinaryOperator<V> accumulatorFunction)
このアップ・データによって管理される指定されたオブジェクトのフィールドを、現在および指定された値に指定された関数を適用した結果で更新し、更新された値を返すことを原子的に更新します。abstract boolean
compareAndSet(T obj, V expect, V update)
「現在の値==
予想される値」である場合、このアップデータが管理する指定されたオブジェクトのフィールド値を、指定された更新済みの値に原子的に設定します。abstract V
get(T obj)
このアップデーターによって管理される指定されたオブジェクトのフィールドに保持されている現在の値を返します。V
getAndAccumulate(T obj, V x, BinaryOperator<V> accumulatorFunction)
指定された関数を現在の値と指定された値に適用して前の値を返す結果で、このアップ・データによって管理される指定されたオブジェクトのフィールドを非アクティブに更新します。V
getAndSet(T obj, V newValue)
このアップデータにより管理される指定されたオブジェクトのフィールドを指定された値に原始的に設定し、以前の値を返します。V
getAndUpdate(T obj, UnaryOperator<V> updateFunction)
このアップ・データで管理されている指定されたオブジェクトのフィールドを、指定された関数を適用した結果で元に戻し、前の値を返すようにアトミックに更新します。abstract void
lazySet(T obj, V newValue)
このアップデータにより管理される指定されたオブジェクトのフィールドを、指定された更新済みの値に最終的に設定します。static <U,W>
AtomicReferenceFieldUpdater<U,W>newUpdater(Class<U> tclass, Class<W> vclass, String fieldName)
指定されたフィールドを持つオブジェクトのアップデータを作成して返します。abstract void
set(T obj, V newValue)
このアップデータにより管理される指定されたオブジェクトのフィールドを、指定された更新済みの値に設定します。V
updateAndGet(T obj, UnaryOperator<V> updateFunction)
このアップ・データによって管理される指定されたオブジェクトのフィールドを、指定された関数を適用した結果で自動的に更新し、更新された値を返します。abstract boolean
weakCompareAndSet(T obj, V expect, V update)
「現在の値==
予想される値」である場合、このアップデータが管理する指定されたオブジェクトのフィールド値を、指定された更新済みの値に原子的に設定します。
-
-
-
メソッドの詳細
-
newUpdater
public static <U,W> AtomicReferenceFieldUpdater<U,W> newUpdater(Class<U> tclass, Class<W> vclass, String fieldName)
指定されたフィールドを持つオブジェクトのアップデータを作成して返します。 Class引数は、リフレクト型とジェネリック型の一致をチェックするために必要です。- 型パラメータ:
U
- tclassのインスタンスの型W
- vclassのインスタンスの型- パラメータ:
tclass
- フィールドを保持するオブジェクトのクラスvclass
- フィールドのクラスfieldName
- 更新するフィールドの名前- 戻り値:
- アップデータ
- 例外:
ClassCastException
- フィールドの型が間違っている場合IllegalArgumentException
- フィールドが揮発性ではない場合RuntimeException
- クラスにフィールドが含まれないかクラスの型が不正な場合、あるいは、呼出し元がJava言語アクセス制御に従ってフィールドにアクセスできない場合は、入れ子にされたリフレクション・ベースの例外がスローされる。
-
compareAndSet
public abstract boolean compareAndSet(T obj, V expect, V update)
「現在の値==
予想される値」である場合、このアップデータが管理する指定されたオブジェクトのフィールド値を、指定された更新済みの値に原子的に設定します。 このメソッドは、compareAndSet
およびset
に対するほかの呼出しで原子性を持つことが保証されていますが、フィールド内のほかの変更に関しては必ずしもそうであるとは限りません。- パラメータ:
obj
- 条件付きでフィールドを設定するオブジェクトexpect
- 予想される値update
- 新しい値- 戻り値:
- 成功した場合は
true
-
weakCompareAndSet
public abstract boolean weakCompareAndSet(T obj, V expect, V update)
「現在の値==
予想される値」である場合、このアップデータが管理する指定されたオブジェクトのフィールド値を、指定された更新済みの値に原子的に設定します。 このメソッドは、compareAndSet
およびset
に対するほかの呼出しで原子性を持つことが保証されていますが、フィールド内のほかの変更に関しては必ずしもそうであるとは限りません。この操作は誤って失敗する可能性があり、順序付けの保証は提供されないため、
compareAndSet
のかわりに適したものになることはほとんどありません。- パラメータ:
obj
- 条件付きでフィールドを設定するオブジェクトexpect
- 予想される値update
- 新しい値- 戻り値:
- 成功した場合は
true
-
set
public abstract void set(T obj, V newValue)
このアップデータにより管理される指定されたオブジェクトのフィールドを、指定された更新済みの値に設定します。 この操作は、後続のcompareAndSet
の呼出しに関しては、揮発性ストアとして動作することが保証されています。- パラメータ:
obj
- フィールドを設定するオブジェクトnewValue
- 新しい値
-
lazySet
public abstract void lazySet(T obj, V newValue)
このアップデータにより管理される指定されたオブジェクトのフィールドを、指定された更新済みの値に最終的に設定します。- パラメータ:
obj
- フィールドを設定するオブジェクトnewValue
- 新しい値- 導入されたバージョン:
- 1.6
-
get
public abstract V get(T obj)
このアップデーターによって管理される指定されたオブジェクトのフィールドに保持されている現在の値を返します。- パラメータ:
obj
- フィールドを取得するオブジェクト- 戻り値:
- 現行値
-
getAndSet
public V getAndSet(T obj, V newValue)
このアップデータにより管理される指定されたオブジェクトのフィールドを指定された値に原始的に設定し、以前の値を返します。- パラメータ:
obj
- フィールドを取得および設定するオブジェクトnewValue
- 新しい値- 戻り値:
- 前の値
-
getAndUpdate
public final V getAndUpdate(T obj, UnaryOperator<V> updateFunction)
このアップ・データで管理されている指定されたオブジェクトのフィールドを、指定された関数を適用した結果で元に戻し、前の値を返すようにアトミックに更新します。 関数は、試行した更新がスレッド間の競合のため失敗したときに再度適用される可能性があるため、副作用を持つべきではありません。- パラメータ:
obj
- フィールドを取得および設定するオブジェクトupdateFunction
- 副作用のない関数- 戻り値:
- 前の値
- 導入されたバージョン:
- 1.8
-
updateAndGet
public final V updateAndGet(T obj, UnaryOperator<V> updateFunction)
このアップ・データによって管理される指定されたオブジェクトのフィールドを、指定された関数を適用した結果で自動的に更新し、更新された値を返します。 関数は、試行した更新がスレッド間の競合のため失敗したときに再度適用される可能性があるため、副作用を持つべきではありません。- パラメータ:
obj
- フィールドを取得および設定するオブジェクトupdateFunction
- 副作用のない関数- 戻り値:
- 更新された値
- 導入されたバージョン:
- 1.8
-
getAndAccumulate
public final V getAndAccumulate(T obj, V x, BinaryOperator<V> accumulatorFunction)
指定された関数を現在の値と指定された値に適用して前の値を返す結果で、このアップ・データによって管理される指定されたオブジェクトのフィールドを非アクティブに更新します。 関数は、試行した更新がスレッド間の競合のため失敗したときに再度適用される可能性があるため、副作用を持つべきではありません。 関数は、現在の値を第1引数とし、指定された更新値を第2引数として適用されます。- パラメータ:
obj
- フィールドを取得および設定するオブジェクトx
- 更新値accumulatorFunction
- 2つの引数を取る、副作用のない関数- 戻り値:
- 前の値
- 導入されたバージョン:
- 1.8
-
accumulateAndGet
public final V accumulateAndGet(T obj, V x, BinaryOperator<V> accumulatorFunction)
このアップ・データによって管理される指定されたオブジェクトのフィールドを、現在および指定された値に指定された関数を適用した結果で更新し、更新された値を返すことを原子的に更新します。 関数は、試行した更新がスレッド間の競合のため失敗したときに再度適用される可能性があるため、副作用を持つべきではありません。 関数は、現在の値を第1引数とし、指定された更新値を第2引数として適用されます。- パラメータ:
obj
- フィールドを取得および設定するオブジェクトx
- 更新値accumulatorFunction
- 2つの引数を取る、副作用のない関数- 戻り値:
- 更新された値
- 導入されたバージョン:
- 1.8
-
-