JavaTM 2 Platform
Standard Ed. 5.0

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

単一の変数に対するロックフリーでスレッドセーフなプログラミングをサポートするクラスの小規模なツールキットです。

参照先:
          説明

クラスの概要
AtomicBoolean 原子的な更新が可能な boolean 値。
AtomicInteger 原子的に更新可能な int 値です。
AtomicIntegerArray 要素の原子的な更新が可能な int 配列です。
AtomicIntegerFieldUpdater<T> 指定されたクラスの指定された volatile int フィールドの原子更新が可能な、リフレクションベースのユーティリティです。
AtomicLong 原子的な更新が可能な long 値です。
AtomicLongArray 要素の原子的な更新が可能な long 配列です。
AtomicLongFieldUpdater<T> 指定されたクラスの指定された volatile long フィールドの原子更新が可能な、リフレクションベースのユーティリティです。
AtomicMarkableReference<V> AtomicMarkableReference は、原子的に更新可能なマークビットとともに、オブジェクト参照を管理します。
AtomicReference<V> 原子的な更新が可能なオブジェクト参照です。
AtomicReferenceArray<E> 要素を原子的に更新可能なオブジェクト参照の配列です。
AtomicReferenceFieldUpdater<T,V> 指定されたクラスの指定された volatile 参照フィールドの原子更新が可能な、リフレクションベースのユーティリティです。
AtomicStampedReference<V> AtomicStampedReference は、原子的に更新可能な整数「スタンプ」とともに、オブジェクト参照を管理します。
 

パッケージ java.util.concurrent.atomic の説明

単一の変数に対するロックフリーでスレッドセーフなプログラミングをサポートするクラスの小規模なツールキットです。基本的に、このパッケージ内のクラスは volatile 値、フィールド、および配列要素の概念を、原子的な条件付き更新操作も提供するクラスにまで拡張します。書式は次のとおりです。

boolean compareAndSet(expectedValue, updateValue);

このメソッド (クラスが異なると引数の型も異なる) が expectedValue を現在保持している場合、変数を updateValue に原子的に設定し、成功すると true を返します。このパッケージ内のクラスには、値を取得したり無条件で設定するメソッド、および弱い条件付き原子更新操作 weakCompareAndSet も含まれます。通常の使用では、弱いバージョンの方が効果的な場合がありますが、指定された weakCompareAndSet メソッド呼び出しが見かけ上でも (つまり、明確な理由なしで) 失敗することがある点が異なります。false が意味するのは、必要に応じて操作を再試行できることだけです。これは、変数が expectedValue を保持し、この変数の設定を試みる他のスレッドが存在しない場合に、呼び出しを繰り返し実行することで最終的な成功が保証されることに基づいています。

これらのメソッド仕様に基づく実装により、最新のプロセッサで使用可能な高効率のマシンレベル原子命令を使用することが可能になります。ただし、一部のプラットフォームでは、これをサポートすることで、何らかの内部ロックが伴う可能性があります。このため、メソッドで非ブロッキングが厳密に保証されるわけではありません。スレッドは、操作を実行する前に一時的にブロックを実行することがあります。

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

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

通常、アクセスおよび更新のメモリ効果は、次の揮発性規則に従います。

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

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

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

原子クラスは、非ブロックデータ構造および関連する基盤クラスを実装するための基本単位として主に設計されています。通常、compareAndSet メソッドはロックの代替ではありません。これは、オブジェクトのクリティカルな更新が「単一の」変数に限定される場合にだけ適用されます。

原子クラスは、java.lang.Integer および関連クラスに対する汎用の代替クラスではありません。このクラスは、hashCodecompareTo などのメソッドを定義しません (原子変数では変更が想定されているため、ハッシュテーブルキーとしては望ましい選択肢ではないため)。また、通常、クラスは目的のアプリケーションで有用な型に対して提供されます。たとえば、byte を表す原子クラスは存在しません。これらの使用頻度の少ないケースでは、AtomicInteger を使用して byte 値を保持し、必要に応じてキャストできます。また、Float.floatToIntBitsFloat.intBitstoFloat 変換を使用して float を保持したり、Double.doubleToLongBitsDouble.longBitsToDouble 変換を使用して double を保持できます。

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

JavaTM 2 Platform
Standard Ed. 5.0

バグの報告と機能のリクエスト
さらに詳しい API リファレンスおよび開発者ドキュメントについては、Java 2 SDK SE 開発者用ドキュメントを参照してください。開発者向けの詳細な解説、概念の概要、用語の定義、バグの回避策、およびコード実例が含まれています。

Copyright 2004 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。