モジュール java.base

パッケージjava.util.concurrent.atomic


パッケージjava.util.concurrent.atomic
単一の変数に対するロックフリーでスレッドセーフなプログラミングをサポートするクラスの小規模なツールキットです。 アトミック・クラスのインスタンスは、メソッドを使用してアクセスおよび更新される値を保持します。それ以外の場合は、関連するアトミックVarHandle操作を使用するフィールドで使用できます。

AtomicBooleanAtomicIntegerAtomicLong、およびAtomicReferenceクラスのインスタンスは、それぞれ対応する型の単一の変数へのアクセスおよび更新を提供します。 各クラスは、その型に対応したユーティリティ・メソッドも提供します。 たとえば、AtomicLongおよびAtomicIntegerクラスは、原子増分メソッドを提供します。 あるアプリケーションが、次のように通し番号を生成するとします。

 
 class Sequencer {
   private final AtomicLong sequenceNumber
     = new AtomicLong(17);
   public long next() {
     return sequenceNumber.getAndIncrement();
   }
 }

含まれる値の任意の変換は、compareAndSetのような低レベル読み取り-変更-書き込み操作と、getAndUpdateのようなより高レベルのメソッドの両方によって提供されます。

これらのクラスは、 java.lang.Integerおよび関連するクラスの汎用的な置換ではありません。 これらは、equalshashCode compareToなどのメソッドを定義しません アトミック変数は変更されることが予想されるため、ハッシュ表キーの選択肢が不足しています。

AtomicIntegerArrayAtomicLongArray、およびAtomicReferenceArrayクラスは、原子操作のサポートをこれらの型の配列にまでさらに拡張します。 これらのクラスは、配列要素に対するvolatileアクセス・セマンティクスの提供にも注目されています。

このパッケージには、単一の値および配列を表すクラスに加えて、選択したクラスの任意のvolatileフィールドでcompareAndSetおよび関連する操作を取得するために使用できる「アップ・データ」クラスが含まれています。 これらのクラスは、VarHandleの導入に先行し、より限定的に使用されます。 AtomicReferenceFieldUpdaterAtomicIntegerFieldUpdater、およびAtomicLongFieldUpdaterは、関連付けられたフィールド型へのアクセスを提供するリフレクション・ベースのユーティリティです。 これらは主に、同じノードの複数のvolatileフィールド(ツリー・ノードのリンクなど)が独立して原子更新の対象となる原子データ構造で使用されます。 これらのクラスを使用すると、原子更新の使用方法および使用するタイミングに関する柔軟性が高まります。ただし、リフレクション・ベースの設定が扱いにくい、使用しにくい、保証が弱くなるなどの犠牲を払う必要があります。

AtomicMarkableReferenceクラスは、単一のboolean値を参照と関連付けます。 たとえば、データ構造の内部でこのビットを使用して、参照中のオブジェクトが論理的に削除済みであることを示せます。 AtomicStampedReferenceクラスは、整数値を参照と関連付けます。 これは、一連の更新に対応するバージョン番号を表す場合などに使用できます。

導入されたバージョン:
1.5