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
のほかの呼出しに関してのみ原子性を保証できます。
修飾子 | コンストラクタと説明 |
---|---|
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)
「現在の値
== 予想される値」である場合、このアップデータが管理する指定されたオブジェクトのフィールド値を、指定された更新済みの値に原子的に設定します。 |
protected AtomicReferenceFieldUpdater()
public static <U,W> AtomicReferenceFieldUpdater<U,W> newUpdater(Class<U> tclass, Class<W> vclass, String fieldName)
U
- tclassのインスタンスの型W
- vclassのインスタンスの型tclass
- フィールドを保持するオブジェクトのクラスvclass
- フィールドのクラスfieldName
- 更新するフィールドの名前ClassCastException
- フィールドの型が間違っている場合IllegalArgumentException
- フィールドが揮発性ではない場合RuntimeException
- クラスにフィールドが含まれないかクラスの型が不正な場合、あるいは、呼出し元がJava言語アクセス制御に従ってフィールドにアクセスできない場合は、入れ子にされたリフレクション・ベースの例外がスローされる。public abstract boolean compareAndSet(T obj, V expect, V update)
==
予想される値」である場合、このアップデータが管理する指定されたオブジェクトのフィールド値を、指定された更新済みの値に原子的に設定します。このメソッドは、compareAndSet
およびset
に対するほかの呼出しで原子性を持つことが保証されていますが、フィールド内のほかの変更に関しては必ずしもそうであるとは限りません。obj
- 条件付きでフィールドを設定するオブジェクトexpect
- 予想される値update
- 新しい値true
public abstract boolean weakCompareAndSet(T obj, V expect, V update)
==
予想される値」である場合、このアップデータが管理する指定されたオブジェクトのフィールド値を、指定された更新済みの値に原子的に設定します。このメソッドは、compareAndSet
およびset
に対するほかの呼出しで原子性を持つことが保証されていますが、フィールド内のほかの変更に関しては必ずしもそうであるとは限りません。
見かけ上失敗する可能性があり、順序付け保証を提供しないため、compareAndSet
の代わりに使用することはほとんどありません。
obj
- 条件付きでフィールドを設定するオブジェクトexpect
- 予想される値update
- 新しい値true
public abstract void set(T obj, V newValue)
compareAndSet
の呼出しに関しては、揮発性ストアとして動作することが保証されています。obj
- フィールドを設定するオブジェクトnewValue
- 新しい値public abstract void lazySet(T obj, V newValue)
obj
- フィールドを設定するオブジェクトnewValue
- 新しい値public abstract V get(T obj)
obj
- フィールドを取得するオブジェクトpublic V getAndSet(T obj, V newValue)
obj
- フィールドを取得および設定するオブジェクトnewValue
- 新しい値public final V getAndUpdate(T obj, UnaryOperator<V> updateFunction)
obj
- フィールドを取得および設定するオブジェクトupdateFunction
- 副作用のない関数public final V updateAndGet(T obj, UnaryOperator<V> updateFunction)
obj
- フィールドを取得および設定するオブジェクトupdateFunction
- 副作用のない関数public final V getAndAccumulate(T obj, V x, BinaryOperator<V> accumulatorFunction)
obj
- フィールドを取得および設定するオブジェクトx
- 更新値accumulatorFunction
- 2つの引数を取る、副作用のない関数public final V accumulateAndGet(T obj, V x, BinaryOperator<V> accumulatorFunction)
obj
- フィールドを取得および設定するオブジェクトx
- 更新値accumulatorFunction
- 2つの引数を取る、副作用のない関数 バグまたは機能を送信
詳細なAPIリファレンスおよび開発者ドキュメントについては、Java SEのドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2020, Oracle and/or its affiliates. All rights reserved. Use is subject to license terms. Documentation Redistribution Policyも参照してください。