- java.lang.Object
-
- java.lang.invoke.VarHandle
-
public abstract class VarHandle extends Object
VarHandleは、動的な強い型指定の参照であり、変数を参照するか、パラメータによって定義された変数ファミリ(静的フィールド、非静的フィールド、配列要素、オフヒープデータ構造体のコンポーネント)を参照します。 このような変数へのアクセスは、プレーンな読取り/書込みアクセス、揮発性読取り/書込みアクセス、比較および設定など、様々なアクセス・モードでサポートされます。VarHandlesは不変であり、可視状態ではありません。 VarHandlesはユーザーがサブクラス化できません。
VarHandleには次のものがあります。
variable typeT (このVarHandleによって参照されるすべての変数の型)coordinate typesCT1, CT2, ..., CTnのリスト。このVarHandleによって参照される変数を共同で検索する座標式のタイプです。
Classオブジェクトで表されます。 座標型のリストは空である可能性があります。lookupVarHandleインスタンスを生成するファクトリ・メソッドは、サポートされている変数型と座標型のリストを文書化します。各アクセス・モードは、1つのアクセス・モード・メソッド(アクセス・モードの名前が付けられた署名多相メソッド)に関連付けられます。 VarHandleインスタンスでアクセス・モード・メソッドが呼び出されると、起動の最初の引数は、変数がアクセスされる正確なオブジェクトを示す座標式になります。 呼出しの末尾の引数は、アクセス・モードの重要度の値を表します。 たとえば、様々なcompare-and-setまたはcompare-and-exchangeアクセス・モードでは、変数の予想値と新しい値に対して2つの後続引数が必要です。
アクセス・モード・メソッドの呼出しに対する引数の個数および型は、静的にチェックされません。 かわりに、各アクセス・モード・メソッドは、
MethodTypeのインスタンスとして表されるaccess mode typeを指定します。これは、引数が動的にチェックされるメソッド・シグネチャの一種として機能します。 アクセス・モード・タイプは、VarHandleインスタンスの座標型およびアクセス・モードの重要度の値の型に関して仮パラメータ・タイプを提供します。 また、アクセス・モード・タイプでは、VarHandleインスタンスの変数型に関して戻り型が与えられます。 VarHandleインスタンスでアクセス・モード・メソッドが呼び出される場合、コール・サイトのシンボリック型記述子、呼出しの引数の実行時型および戻り値の実行時型は、アクセス・モード・タイプで指定された型を一致する必要があります。 一致が失敗すると、実行時例外がスローされます。 たとえば、アクセス・モード・メソッドcompareAndSet(java.lang.Object...)は、受信側が座標型CT1, ..., CTnおよび変数型Tを持つVarHandleインスタンスである場合、そのアクセス・モード・タイプは(CT1 c1, ..., CTn cn, T expectedValue, T newValue)booleanであることを指定します。 VarHandleインスタンスが配列要素にアクセスでき、その座標型がString[]およびintで、その変数型がStringであるとします。 このVarHandleインスタンスのcompareAndSetのアクセス・モード・タイプは、(String[] c1, int c2, String expectedValue, String newValue)booleanになります。 このようなVarHandleインスタンスは、array factory methodによって生成され、次のように配列要素にアクセスします:String[] sa = ... VarHandle avh = MethodHandles.arrayElementVarHandle(String[].class); boolean r = avh.compareAndSet(sa, 10, "expected", "new");アクセス・モードは、原子性および一貫性のプロパティを制御します。 プレーン読取り(
get)および書込み(set)アクセスは、参照および最大32ビットのプリミティブ値に対してのみビット単位のアトミックであることが保証され、実行スレッド以外のスレッドに対して監視可能な順序付け制約は適用されません。 Opaque操作はビット単位のアトミックであり、同じ変数へのアクセスに関して一貫して順序付けされます。 不透明なプロパティーに従うことに加えて、Acquireモードの読み取りとその後続のアクセスは、Releaseモードの書き込みとそれまでのアクセスを照合したあとに順序付けられます。 AcquireプロパティーとReleaseプロパティーに従うことに加えて、すべての Volatile操作は相互に完全に順序付けられます。アクセス・モードは、次のカテゴリにグループ化されます。
- 指定されたメモリー順序付け効果で変数の値を取得する読み取りアクセスモード。 このグループに属する対応するアクセス・モード・メソッドのセットは、
get、getVolatile、getAcquire、getOpaqueの各メソッドで構成されます。 - 指定されたメモリー順序付け効果で変数の値を設定する書き込みアクセスモード。 このグループに属する対応するアクセス・モード・メソッドのセットは、
set、setVolatile、setRelease、setOpaqueの各メソッドで構成されます。 - たとえば、指定されたメモリー順序付け効果で変数の値を原子的に比較および設定するアトミック更新アクセスモード。 このグループに属する対応するアクセス・モード・メソッドのセットは、
compareAndSet、weakCompareAndSetPlain、weakCompareAndSet、weakCompareAndSetAcquire、weakCompareAndSetRelease、compareAndExchangeAcquire、compareAndExchange、compareAndExchangeRelease、getAndSet、getAndSetAcquire、getAndSetReleaseの各メソッドで構成されます。 - 数値アトミック更新アクセスモード。たとえば、指定されたメモリー順序付け効果で変数の値を加算して、原子的に取得および設定します。 このグループに属する対応するアクセス・モード・メソッドのセットは、
getAndAdd、getAndAddAcquire、getAndAddReleaseの各メソッドで構成されます。 - ビット単位のアトミック更新アクセスモード。たとえば、指定されたメモリー順序付け効果で変数の値をアトミックに取得したりビット単位にしたりします。 このグループに属する対応するアクセス・モード・メソッドのセットは、
getAndBitwiseOr、getAndBitwiseOrAcquire、getAndBitwiseOrRelease、getAndBitwiseAnd、getAndBitwiseAndAcquire、getAndBitwiseAndRelease、getAndBitwiseXor、getAndBitwiseXorAcquire、getAndBitwiseXorReleaseの各メソッドで構成されます。
lookupVarHandleインスタンスを生成または生成するファクトリ・メソッドは、サポートされている一連のアクセス・モードを文書化します。これには、変数の型および変数が読取り専用かどうかに基づくドキュメント化の制限が含まれる場合もあります。 アクセス・モードがサポートされていない場合、対応するアクセス・モード・メソッドは呼出し時にUnsupportedOperationExceptionをスローします。 ファクトリ・メソッドは、アクセス・モード・メソッドによってスローされる可能性のある追加の宣言されていない例外を文書化する必要があります。getアクセス・モードはすべてのVarHandleインスタンスでサポートされており、対応するメソッドはUnsupportedOperationExceptionをスローしません。 VarHandleが読取り専用変数(finalフィールドなど)を参照する場合、書込み、アトミック更新、数値アトミック更新およびビット単位のアトミック更新アクセス・モードはサポートされず、対応するメソッドはUnsupportedOperationExceptionをスローします。 読取り/書込みアクセス・モード(サポートされている場合)は、getおよびsetを除いて、参照型およびすべてのプリミティブ型にアトミック・アクセスを提供します。 ファクトリ・メソッドのドキュメントで特に明記されていないかぎり、アクセス・モードgetおよびset(サポートされている場合)は、参照型およびすべてのプリミティブ型にアトミック・アクセスを提供します。ただし、32ビット・プラットフォームではlongおよびdoubleは例外です。アクセス・モードは、変数の宣言サイトで指定したメモリー順序付け効果をオーバーライドします。 たとえば、
getアクセス・モードを使用してフィールドにアクセスするVarHandleは、そのフィールドがvolatileと宣言されている場合でも、そのアクセス・モードによって指定されたフィールドにアクセスします。 Javaメモリー・モデルでは驚くべき結果が得られる可能性があるため、混合アクセスを実行する場合は細心の注意を払う必要があります。様々なアクセス・モードで変数へのアクセスをサポートすることに加えて、メモリー・フェンス・メソッドと呼ばれる一連の静的メソッドも、メモリー順序付けをきめ細かく制御するために提供されます。 Java言語仕様では、他のスレッドが、ロック、
volatileフィールドまたはVarHandlesの使用などによって発生する制約に応じて、プログラム・ソース・コードとは異なる順序で実行されたかのように操作を監視できます。 静的メソッドfullFence、acquireFence、releaseFence、loadLoadFenceおよびstoreStoreFenceを使用して、制約を適用することもできます。 これらの仕様は、特定のアクセスモードの場合と同様に、「再順序付け」の欠如、つまりフェンスが存在しなかった場合に発生する可能性のある観察可能な順序付け効果に関して表現されます。 アクセス・モード・メソッドおよびメモリー・フェンス・メソッドの仕様のより正確なフレーズは、Java言語仕様の今後の更新に伴う可能性があります。アクセス・モード・メソッドの呼出しのコンパイル
アクセス・モード・メソッドに名前を付けるJavaメソッド・コール式は、Javaソース・コードからVarHandleを呼び出すことができます。 ソース・コードの観点から、これらのメソッドは任意の引数を取り、その多相結果(表現されている場合)を任意の戻り型にキャストできます。 正式にこれは、アクセス・モード・メソッドの変数引数のObject引数とObject戻り型(戻り型が多相の場合)を指定することで実現されますが、この呼出しの自由をJVM実行スタックに直接接続するシグネチャ多相という追加の品質が得られます。仮想メソッドの場合と同様に、アクセス・モード・メソッドへのソース・レベルのコールは、
invokevirtual命令にコンパイルされます。 通常とは異なる点として、コンパイラは実際の引数の型を記録する必要があり、引数に対するメソッド呼出し変換を実行することができません。 代わりに、独自の変換されていないタイプに従ってスタックにプッシュする命令を生成する必要があります。 VarHandleオブジェクト自体は、引数の前にスタックにプッシュされます。 コンパイラは、引数と戻り型を記述するシンボリック型記述子を使用してアクセス・モード・メソッドを呼び出すinvokevirtual命令を生成します。完全なシンボリック型記述子を発行するには、コンパイラは戻り型も決定する必要があります(多相の場合)。 これは、メソッド呼出し式に対するキャスト(存在する場合)、または呼出しが式の場合は
Object、呼出しが文の場合はvoidに基づきます。 キャスト先はプリミティブ型でもかまいません(ただしvoidは不可)。特殊なケースとして、キャストされていない
null引数にはjava.lang.Voidのシンボリック型記述子が与えられます。Void型の参照はnull参照以外には存在しないため、型Voidのあいまいさが問題になることはありません。アクセス・モード・メソッドの起動の実行
invokevirtual命令は、最初に実行されるときに、命令内の名前を象徴的に解決し、メソッド・コールが静的に有効であることを検証することによってリンクされます。 これは、モード・メソッドにアクセスするためのコールも保持します。 この場合、コンパイラによって生成されるシンボリック型記述子は正しい構文がないかチェックされ、それに含まれる名前が解決されます。 したがって、アクセス・モード・メソッドを起動するinvokevirtual命令は、シンボリック型記述子が構文的に整形式であり、型が存在しているかぎり、常にリンクします。リンク後に
invokevirtualが実行されると、JVMによって受信側のVarHandleのアクセス・モード・タイプが最初にチェックされ、シンボリック型記述子と一致することが確認されます。 型の一致が失敗した場合、呼出し側が呼び出すアクセス・モード・メソッドが、呼び出される個々のVarHandleに存在しないことを意味します。アクセス・モード・メソッドの呼出しは、
MethodHandle.invoke(java.lang.Object...)の呼出しのように動作します。受信メソッド・ハンドルは、VarHandleインスタンスを先頭の引数として受け入れます。 具体的には、{access-mode}はアクセス・モード・メソッド名に対応しています。
次のように動作します。VarHandle vh = .. R r = (R) vh.{access-mode}(p1, p2, ..., pN);
(moduloアクセス・モード・メソッドは、VarHandle vh = .. VarHandle.AccessMode am = VarHandle.AccessMode.valueFromMethodName("{access-mode}"); MethodHandle mh = MethodHandles.varHandleExactInvoker( am, vh.accessModeType(am)); R r = (R) mh.invoke(vh, p1, p2, ..., pN)Throwableのスローを宣言しません)。 これは、次の操作に相当します。
目的のメソッド型がシンボリック型記述子であり、MethodHandle mh = MethodHandles.lookup().findVirtual( VarHandle.class, "{access-mode}", MethodType.methodType(R, p1, p2, ..., pN)); R r = (R) mh.invokeExact(vh, p1, p2, ..., pN)MethodHandle.invokeExact(java.lang.Object...)が実行されるのは、ターゲットを呼び出す前に、ハンドルが参照キャストを必要に応じて適用し、asType(MethodHandles.varHandleInvoker(java.lang.invoke.VarHandle.AccessMode, java.lang.invoke.MethodType)も参照)のようにbox、unboxまたはワイドプリミティブ値を適用するためです。 より簡潔に言うと、このような動作は次のようになります。
この場合、メソッド・ハンドルはVarHandleインスタンスにバインドされます。VarHandle vh = .. VarHandle.AccessMode am = VarHandle.AccessMode.valueFromMethodName("{access-mode}"); MethodHandle mh = vh.toMethodHandle(am); R r = (R) mh.invoke(p1, p2, ..., pN)呼出しのチェック
通常のプログラムでは、VarHandleアクセス・モード・タイプの照合は通常成功します。 ただし、一致が失敗した場合、JVMはWrongMethodTypeExceptionをスローします。したがって、静的に型指定されたプログラムでリンケージ・エラーとして表示されるアクセス・モード・タイプの不一致は、VarHandlesを使用するプログラムで動的
WrongMethodTypeExceptionとして表示される可能性があります。アクセス・モード・タイプにはライブの
Classオブジェクトが含まれているため、メソッド・タイプ照合ではタイプ名とクラス・ローダーの両方が考慮されます。 したがって、VarHandleVHが1つのクラス・ローダーL1で作成され、別のL2で使用される場合でも、L2で解決される呼出し側のシンボリック型記述子は元の呼出し先メソッドのシンボリック型記述子と照合され、L1で解決されるので、VarHandleアクセス・モード・メソッド呼出しは型安全です。L1の解決は、VHが作成され、そのアクセス・モード・タイプが割り当てられるときに行われ、L2の解決は、invokevirtual命令がリンクされると行われます。型記述子のチェックとは別に、その変数にアクセスするVarHandlesの機能は制限されていません。 VarHandleが、その変数にアクセスできるクラスによって非public変数に形成される場合、結果のVarHandleは、その変数への参照を受け取るすべての呼出し元によって任意の場所で使用できます。
リフレクティブ・メソッドが呼び出されるたびにアクセスがチェックされるコア・リフレクションAPIとは異なり、VarHandleアクセス・チェックはVarHandleの作成時に実行されます。 したがって、非公開変数または非公開クラスの変数へのVarHandlesは、通常、秘密にしておく必要があります。 信頼できないコードがそれらを使用しても問題が発生しない場合を除き、それらを信頼できないコードに渡さないようにしてください。
VarHandleの作成
Javaコードでは、そのコードからアクセス可能な任意のフィールドに直接アクセスするVarHandleを作成できます。 これは、MethodHandles.Lookupという反射型の機能ベースのAPIを介して行われます。 たとえば、非静的フィールドのVarHandleは、Lookup.findVarHandleから取得できます。 コア・リフレクションAPIオブジェクトLookup.unreflectVarHandleからの変換メソッドもあります。保護されたフィールド・メンバーへのアクセスは、アクセス・クラスの受信者のみ、またはそのサブクラスのいずれかに制限され、アクセス・クラスは保護されたメンバーの定義クラスのサブクラス(またはパッケージの兄弟)である必要があります。 VarHandleが、現在のパッケージ外の宣言クラスのprotected非staticフィールドを参照する場合、受信者引数はアクセス・クラスの型に絞り込まれます。
VarHandlesとコア・リフレクションAPI間の相互運用
LookupAPIでファクトリ・メソッドを使用すると、コア・リフレクションAPIオブジェクトで表されるすべてのフィールドを、動作的に同等のVarHandleに変換できます。 たとえば、リフレクティブFieldは、Lookup.unreflectVarHandleを使用してVarHandleに変換できます。 結果のVarHandlesは、通常、基礎となるフィールドへのより直接的で効率的なアクセスを提供します。特殊なケースとして、Core Reflection APIを使用してこのクラスの署名多相アクセス・モード・メソッドを表示すると、それらは通常の非多相メソッドとして表示されます。
Class.getDeclaredMethodで示されるそれらのリフレクション表現は、このAPIでの特殊なステータスの影響を受けません。 たとえば、Method.getModifiersでは、同様に宣言されたすべてのメソッドで必要になる修飾子ビット(この場合はnativeビットやvarargsビットなど)が厳密に報告されます。リフレクトされたメソッドと同様に、これらのメソッド(リフレクトされた場合)は、
java.lang.reflect.Method.invokeを介して直接、またはJNIを介して間接的に、またはLookup.unreflectを介して呼び出すことができます。 ただし、このようなリフレクティブ・コールでは、アクセス・モード・メソッドの呼出しは行われません。 そのような呼出しに必要な引数(Object[]型の単一の引数)を渡してもその引数は無視され、UnsupportedOperationExceptionがスローされます。invokevirtual命令は、任意のシンボリック型記述子の下でVarHandleアクセス・モード・メソッドをネイティブに呼び出すことができるため、このリフレクティブ・ビューはバイトコードを介してこれらのメソッドの通常の表現と競合します。 したがって、これらのネイティブ・メソッドは、Class.getDeclaredMethodによって反射的に表示される場合、プレースホルダとみなされる場合があります。特定のアクセス・モード・タイプの実行者メソッドを取得するには、
MethodHandles.varHandleExactInvoker(java.lang.invoke.VarHandle.AccessMode, java.lang.invoke.MethodType)またはMethodHandles.varHandleInvoker(java.lang.invoke.VarHandle.AccessMode, java.lang.invoke.MethodType)を使用します。Lookup.findVirtualAPIは、指定されたアクセス・モード・タイプのアクセス・モード・メソッドをコールするメソッド・ハンドルを返すこともでき、MethodHandles.varHandleInvoker(java.lang.invoke.VarHandle.AccessMode, java.lang.invoke.MethodType)の動作と同等です。VarHandlesジェネリックスとJavaジェネリックスの間の相互運用
VarHandleは、Java汎用型で宣言されるフィールドなどの変数に対して取得できます。 Core Reflection APIと同様に、VarHandleの変数型は、ソース・レベル型の消去から構築されます。 VarHandleアクセス・モード・メソッドが呼び出されると、その引数の型または戻り値のキャスト型は、汎用型または型インスタンスになります。 これが起こった場合、コンパイラは、invokevirtual命令のシンボリック型記述子を構築する際に、それらの型を対応するイレイジャで置き換えます。- 導入されたバージョン:
- 9
- 関連項目:
MethodHandle,MethodHandles,MethodType
-
-
ネストされたクラスのサマリー
ネストされたクラス 修飾子と型 クラス 説明 static classVarHandle.AccessModeVarHandleによって参照される変数へのアクセス方法を指定するアクセス・モードのセット。
-
メソッドのサマリー
すべてのメソッド 静的メソッド インスタンス・メソッド 具象メソッド 修飾子と型 メソッド 説明 MethodTypeaccessModeType(VarHandle.AccessMode accessMode)このVarHandleおよび指定されたアクセス・モードのアクセス・モード・タイプを取得します。static voidacquireFence()フェンスの前のロードが、フェンスの後のロードおよびストアで並べ替えられないようにします。ObjectcompareAndExchange(Object... args)変数の現在の値(getVolatile(java.lang.Object...)のメモリー・セマンティクスでアクセスされるexpectedValueのwitness value、==)が、getVolatile(java.lang.Object...)のメモリー・セマンティクスでアクセスされる場合は、setVolatile(java.lang.Object...)のメモリー・セマンティクスで変数の値をnewValueに設定します。ObjectcompareAndExchangeAcquire(Object... args)変数の現在の値(getAcquire(java.lang.Object...)のメモリー・セマンティクスでアクセスされるexpectedValueのwitness value、==)が、getAcquire(java.lang.Object...)のメモリー・セマンティクスでアクセスされる場合は、set(java.lang.Object...)のメモリー・セマンティクスで変数の値をnewValueに設定します。ObjectcompareAndExchangeRelease(Object... args)変数の現在の値(get(java.lang.Object...)のメモリー・セマンティクスでアクセスされるexpectedValueのwitness value、==)が、get(java.lang.Object...)のメモリー・セマンティクスでアクセスされる場合は、setRelease(java.lang.Object...)のメモリー・セマンティクスで変数の値をnewValueに設定します。booleancompareAndSet(Object... args)変数の現在の値(getVolatile(java.lang.Object...)のメモリー・セマンティクスでアクセスされるexpectedValueのwitness value、==)が、getVolatile(java.lang.Object...)のメモリー・セマンティクスでアクセスされる場合は、setVolatile(java.lang.Object...)のメモリー・セマンティクスで変数の値をnewValueに設定します。List<Class<?>>coordinateTypes()このVarHandleの座標型を返します。static voidfullFence()フェンスの前のロードおよびストアが、フェンスの後のロードおよびストアで並べ替えられないようにします。Objectget(Object... args)変数が非volatileとして宣言されたかのように、読取りのメモリー・セマンティクスを使用して、変数の値を返します。ObjectgetAcquire(Object... args)変数の値を返し、後続のロードおよびストアがこのアクセスの前に並べ替えられないようにします。ObjectgetAndAdd(Object... args)setVolatile(java.lang.Object...)のメモリー・セマンティクスを持つ変数の現在の値にvalueを原子的に追加し、getVolatile(java.lang.Object...)のメモリー・セマンティクスでアクセスされる変数の前の値を返します。ObjectgetAndAddAcquire(Object... args)set(java.lang.Object...)のメモリー・セマンティクスを持つ変数の現在の値にvalueを原子的に追加し、getAcquire(java.lang.Object...)のメモリー・セマンティクスでアクセスされる変数の前の値を返します。ObjectgetAndAddRelease(Object... args)setRelease(java.lang.Object...)のメモリー・セマンティクスを持つ変数の現在の値にvalueを原子的に追加し、get(java.lang.Object...)のメモリー・セマンティクスでアクセスされる変数の前の値を返します。ObjectgetAndBitwiseAnd(Object... args)変数の現在の値と、setVolatile(java.lang.Object...)のメモリー・セマンティクスを持つmaskの間のビット単位ANDの結果に変数の値を原子的に設定し、getVolatile(java.lang.Object...)のメモリー・セマンティクスでアクセスされる変数の前の値を返します。ObjectgetAndBitwiseAndAcquire(Object... args)変数の現在の値と、set(java.lang.Object...)のメモリー・セマンティクスを持つmaskの間のビット単位ANDの結果に変数の値を原子的に設定し、getAcquire(java.lang.Object...)のメモリー・セマンティクスでアクセスされる変数の前の値を返します。ObjectgetAndBitwiseAndRelease(Object... args)変数の現在の値と、setRelease(java.lang.Object...)のメモリー・セマンティクスを持つmaskの間のビット単位ANDの結果に変数の値を原子的に設定し、get(java.lang.Object...)のメモリー・セマンティクスでアクセスされる変数の前の値を返します。ObjectgetAndBitwiseOr(Object... args)変数の現在の値と、setVolatile(java.lang.Object...)のメモリー・セマンティクスを持つmaskの間のビット単位ORの結果に変数の値を原子的に設定し、getVolatile(java.lang.Object...)のメモリー・セマンティクスでアクセスされる変数の前の値を返します。ObjectgetAndBitwiseOrAcquire(Object... args)変数の現在の値と、set(java.lang.Object...)のメモリー・セマンティクスを持つmaskの間のビット単位ORの結果に変数の値を原子的に設定し、getAcquire(java.lang.Object...)のメモリー・セマンティクスでアクセスされる変数の前の値を返します。ObjectgetAndBitwiseOrRelease(Object... args)変数の現在の値と、setRelease(java.lang.Object...)のメモリー・セマンティクスを持つmaskの間のビット単位ORの結果に変数の値を原子的に設定し、get(java.lang.Object...)のメモリー・セマンティクスでアクセスされる変数の前の値を返します。ObjectgetAndBitwiseXor(Object... args)変数の現在の値と、setVolatile(java.lang.Object...)のメモリー・セマンティクスを持つmaskの間のビット単位のXORの結果に変数の値を原子的に設定し、getVolatile(java.lang.Object...)のメモリー・セマンティクスでアクセスされる変数の前の値を返します。ObjectgetAndBitwiseXorAcquire(Object... args)変数の現在の値と、set(java.lang.Object...)のメモリー・セマンティクスを持つmaskの間のビット単位のXORの結果に変数の値を原子的に設定し、getAcquire(java.lang.Object...)のメモリー・セマンティクスでアクセスされる変数の前の値を返します。ObjectgetAndBitwiseXorRelease(Object... args)変数の現在の値と、setRelease(java.lang.Object...)のメモリー・セマンティクスを持つmaskの間のビット単位のXORの結果に変数の値を原子的に設定し、get(java.lang.Object...)のメモリー・セマンティクスでアクセスされる変数の前の値を返します。ObjectgetAndSet(Object... args)setVolatile(java.lang.Object...)のメモリー・セマンティクスを使用して変数の値をnewValueに原子的に設定し、getVolatile(java.lang.Object...)のメモリー・セマンティクスを使用してアクセスされる変数の前の値を返します。ObjectgetAndSetAcquire(Object... args)set(java.lang.Object...)のメモリー・セマンティクスを使用して変数の値をnewValueに原子的に設定し、getAcquire(java.lang.Object...)のメモリー・セマンティクスを使用してアクセスされる変数の前の値を返します。ObjectgetAndSetRelease(Object... args)setRelease(java.lang.Object...)のメモリー・セマンティクスを使用して変数の値をnewValueに原子的に設定し、get(java.lang.Object...)のメモリー・セマンティクスを使用してアクセスされる変数の前の値を返します。ObjectgetOpaque(Object... args)プログラム順にアクセスされる変数の値を返します。ただし、他のスレッドに対するメモリー順序付けの影響は保証されません。ObjectgetVolatile(Object... args)変数がvolatileとして宣言されたかのように、読取りのメモリー・セマンティクスを使用して、変数の値を返します。booleanisAccessModeSupported(VarHandle.AccessMode accessMode)指定されたアクセス・モードがサポートされている場合はtrueを戻し、それ以外の場合はfalseを戻します。static voidloadLoadFence()フェンスの前の荷重が、フェンスの後の荷重で並べ替えられないようにします。static voidreleaseFence()フェンスの前のロードおよび格納が、フェンスの後の店舗で並べ替えられないようにします。voidset(Object... args)変数が非volatileおよび非finalとして宣言されたかのように設定するメモリー・セマンティクスを使用して、変数の値をnewValueに設定します。voidsetOpaque(Object... args)変数の値をプログラム順序でnewValueに設定しますが、他のスレッドに対するメモリー順序付けの影響は保証されません。voidsetRelease(Object... args)変数の値をnewValueに設定し、このアクセス後に以前のロードおよびストアが並べ替えられないようにします。voidsetVolatile(Object... args)変数の値をnewValueに設定します。メモリー・セマンティクスは、変数がvolatileとして宣言されたかのように設定します。static voidstoreStoreFence()フェンスの前のストアが、フェンスの後のストアで並べ替えられないようにします。MethodHandletoMethodHandle(VarHandle.AccessMode accessMode)このVarHandleおよび指定されたアクセス・モードにバインドされたメソッド・ハンドルを取得します。Class<?>varType()このVarHandleによって参照される変数の変数型を返します。booleanweakCompareAndSet(Object... args)変数の現在の値(getVolatile(java.lang.Object...)のメモリー・セマンティクスでアクセスされるexpectedValueのwitness value、==)が、getVolatile(java.lang.Object...)のメモリー・セマンティクスでアクセスされる場合は、setVolatile(java.lang.Object...)のメモリー・セマンティクスで変数の値をnewValueに原子的に設定します。booleanweakCompareAndSetAcquire(Object... args)変数の現在の値(getAcquire(java.lang.Object...)のメモリー・セマンティクスでアクセスされるexpectedValueをwitness value、==と呼びます)が、set(java.lang.Object...)のセマンティクスを使用して、変数の値をnewValueに原子的に設定します。booleanweakCompareAndSetPlain(Object... args)変数の現在の値(get(java.lang.Object...)のメモリー・セマンティクスでアクセスされるexpectedValueをwitness value、==と呼びます)が、set(java.lang.Object...)のセマンティクスを使用して、変数の値をnewValueに原子的に設定します。booleanweakCompareAndSetRelease(Object... args)変数の現在の値(get(java.lang.Object...)のメモリー・セマンティクスでアクセスされるexpectedValueをwitness value、==と呼びます)が、setRelease(java.lang.Object...)のセマンティクスを使用して、変数の値をnewValueに原子的に設定します。
-
-
-
メソッドの詳細
-
get
public final Object get(Object... args)
変数が非volatileとして宣言されたかのように、読取りのメモリー・セマンティクスを使用して、変数の値を返します。 一般に、プレーン読取りアクセスと呼ばれます。メソッド・シグネチャの形式は、
(CT1 ct1, ..., CTn ctn)Tです。getのコール・サイトのシンボリック型記述子は、このVarHandleでaccessModeType(VarHandle.AccessMode.GET)をコールした結果であるアクセス・モード型と一致する必要があります。このアクセス・モードは、すべてのVarHandleインスタンスでサポートされており、
UnsupportedOperationExceptionはスローされません。- パラメータ:
args- varargsを使用して静的に表される(CT1 ct1, ..., CTn)形式のシグネチャ多相パラメータ・リスト。- 戻り値:
- 変数の値であるシグネチャ多相的な結果は、
Objectを使用して静的に表されます。 - 例外:
WrongMethodTypeException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致しない場合。ClassCastException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致するが、参照キャストが失敗した場合。
-
set
public final void set(Object... args)
変数が非volatileおよび非finalとして宣言されたかのように設定するメモリー・セマンティクスを使用して、変数の値をnewValueに設定します。 一般に、プレーン書込みアクセスと呼ばれます。メソッド・シグネチャの形式は、
(CT1 ct1, ..., CTn ctn, T newValue)voidです。setのコール・サイトのシンボリック型記述子は、このVarHandleでaccessModeType(VarHandle.AccessMode.SET)をコールした結果であるアクセス・モード型と一致する必要があります。- パラメータ:
args- varargsを使用して静的に表される(CT1 ct1, ..., CTn ctn, T newValue)形式のシグネチャ多相パラメータ・リスト。- 例外:
UnsupportedOperationException- このVarHandleでアクセス・モードがサポートされていない場合。WrongMethodTypeException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致しない場合。ClassCastException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致するが、参照キャストが失敗した場合。
-
getVolatile
public final Object getVolatile(Object... args)
変数がvolatileとして宣言されたかのように、読取りのメモリー・セマンティクスを使用して、変数の値を返します。メソッド・シグネチャの形式は、
(CT1 ct1, ..., CTn ctn)Tです。getVolatileのコール・サイトのシンボリック型記述子は、このVarHandleでaccessModeType(VarHandle.AccessMode.GET_VOLATILE)をコールした結果であるアクセス・モード型と一致する必要があります。- パラメータ:
args- varargsを使用して静的に表される(CT1 ct1, ..., CTn ctn)形式のシグネチャ多相パラメータ・リスト。- 戻り値:
- 変数の値であるシグネチャ多相的な結果は、
Objectを使用して静的に表されます。 - 例外:
UnsupportedOperationException- このVarHandleでアクセス・モードがサポートされていない場合。WrongMethodTypeException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致しない場合。ClassCastException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致するが、参照キャストが失敗した場合。
-
setVolatile
public final void setVolatile(Object... args)
変数の値をnewValueに設定します。メモリー・セマンティクスは、変数がvolatileとして宣言されたかのように設定します。メソッド・シグネチャの形式は、
(CT1 ct1, ..., CTn ctn, T newValue)voidです。setVolatileのコール・サイトのシンボリック型記述子は、このVarHandleでaccessModeType(VarHandle.AccessMode.SET_VOLATILE)をコールした結果であるアクセス・モード型と一致する必要があります。- APIのノート:
- CおよびC++とのセマンティクスの多くの違いを無視して、このメソッドには
memory_order_seq_cstと互換性のあるメモリー順序付け効果があります。 - パラメータ:
args- varargsを使用して静的に表される(CT1 ct1, ..., CTn ctn, T newValue)形式のシグネチャ多相パラメータ・リスト。- 例外:
UnsupportedOperationException- このVarHandleでアクセス・モードがサポートされていない場合。WrongMethodTypeException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致しない場合。ClassCastException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致するが、参照キャストが失敗した場合。
-
getOpaque
public final Object getOpaque(Object... args)
プログラム順にアクセスされる変数の値を返します。ただし、他のスレッドに対するメモリー順序付けの影響は保証されません。メソッド・シグネチャの形式は、
(CT1 ct1, ..., CTn ctn)Tです。getOpaqueのコール・サイトのシンボリック型記述子は、このVarHandleでaccessModeType(VarHandle.AccessMode.GET_OPAQUE)をコールした結果であるアクセス・モード型と一致する必要があります。- パラメータ:
args- varargsを使用して静的に表される(CT1 ct1, ..., CTn ctn)形式のシグネチャ多相パラメータ・リスト。- 戻り値:
- 変数の値であるシグネチャ多相的な結果は、
Objectを使用して静的に表されます。 - 例外:
UnsupportedOperationException- このVarHandleでアクセス・モードがサポートされていない場合。WrongMethodTypeException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致しない場合。ClassCastException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致するが、参照キャストが失敗した場合。
-
setOpaque
public final void setOpaque(Object... args)
変数の値をプログラム順序でnewValueに設定しますが、他のスレッドに対するメモリー順序付けの影響は保証されません。メソッド・シグネチャの形式は、
(CT1 ct1, ..., CTn ctn, T newValue)voidです。setOpaqueのコール・サイトのシンボリック型記述子は、このVarHandleでaccessModeType(VarHandle.AccessMode.SET_OPAQUE)をコールした結果であるアクセス・モード型と一致する必要があります。- パラメータ:
args- varargsを使用して静的に表される(CT1 ct1, ..., CTn ctn, T newValue)形式のシグネチャ多相パラメータ・リスト。- 例外:
UnsupportedOperationException- このVarHandleでアクセス・モードがサポートされていない場合。WrongMethodTypeException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致しない場合。ClassCastException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致するが、参照キャストが失敗した場合。
-
getAcquire
public final Object getAcquire(Object... args)
変数の値を返し、後続のロードおよびストアがこのアクセスの前に並べ替えられないようにします。メソッド・シグネチャの形式は、
(CT1 ct1, ..., CTn ctn)Tです。getAcquireのコール・サイトのシンボリック型記述子は、このVarHandleでaccessModeType(VarHandle.AccessMode.GET_ACQUIRE)をコールした結果であるアクセス・モード型と一致する必要があります。- APIのノート:
- CおよびC++とのセマンティックの多くの違いを無視して、このメソッドには、
memory_order_acquire順序付けと互換性のあるメモリー順序付け効果があります。 - パラメータ:
args- varargsを使用して静的に表される(CT1 ct1, ..., CTn ctn)形式のシグネチャ多相パラメータ・リスト。- 戻り値:
- 変数の値であるシグネチャ多相的な結果は、
Objectを使用して静的に表されます。 - 例外:
UnsupportedOperationException- このVarHandleでアクセス・モードがサポートされていない場合。WrongMethodTypeException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致しない場合。ClassCastException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致するが、参照キャストが失敗した場合。
-
setRelease
public final void setRelease(Object... args)
変数の値をnewValueに設定し、このアクセス後に以前のロードおよびストアが並べ替えられないようにします。メソッド・シグネチャの形式は、
(CT1 ct1, ..., CTn ctn, T newValue)voidです。setReleaseのコール・サイトのシンボリック型記述子は、このVarHandleでaccessModeType(VarHandle.AccessMode.SET_RELEASE)をコールした結果であるアクセス・モード型と一致する必要があります。- APIのノート:
- CおよびC++とのセマンティックの多くの違いを無視して、このメソッドには、
memory_order_release順序付けと互換性のあるメモリー順序付け効果があります。 - パラメータ:
args- varargsを使用して静的に表される(CT1 ct1, ..., CTn ctn, T newValue)形式のシグネチャ多相パラメータ・リスト。- 例外:
UnsupportedOperationException- このVarHandleでアクセス・モードがサポートされていない場合。WrongMethodTypeException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致しない場合。ClassCastException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致するが、参照キャストが失敗した場合。
-
compareAndSet
public final boolean compareAndSet(Object... args)
変数の現在の値(getVolatile(java.lang.Object...)のメモリー・セマンティクスでアクセスされるexpectedValueのwitness value、==)が、getVolatile(java.lang.Object...)のメモリー・セマンティクスでアクセスされる場合は、setVolatile(java.lang.Object...)のメモリー・セマンティクスで変数の値をnewValueに設定します。メソッド・シグネチャの形式は、
(CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)booleanです。compareAndSetのコール・サイトのシンボリック型記述子は、このVarHandleでaccessModeType(VarHandle.AccessMode.COMPARE_AND_SET)をコールした結果であるアクセス・モード型と一致する必要があります。- パラメータ:
args- varargsを使用して静的に表される(CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)形式のシグネチャ多相パラメータ・リスト。- 戻り値:
- 成功した場合は
true、成功した場合はfalse(証人値がexpectedValueと同じでない場合)。 - 例外:
UnsupportedOperationException- このVarHandleでアクセス・モードがサポートされていない場合。WrongMethodTypeException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致しない場合。ClassCastException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致するが、参照キャストが失敗した場合。- 関連項目:
setVolatile(Object...),getVolatile(Object...)
-
compareAndExchange
public final Object compareAndExchange(Object... args)
変数の現在の値(getVolatile(java.lang.Object...)のメモリー・セマンティクスでアクセスされるexpectedValueのwitness value、==)が、getVolatile(java.lang.Object...)のメモリー・セマンティクスでアクセスされる場合は、setVolatile(java.lang.Object...)のメモリー・セマンティクスで変数の値をnewValueに設定します。メソッド・シグネチャの形式は、
(CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)Tです。compareAndExchangeのコール・サイトのシンボリック型記述子は、このVarHandleでaccessModeType(VarHandle.AccessMode.COMPARE_AND_EXCHANGE)をコールした結果であるアクセス・モード型と一致する必要があります。- パラメータ:
args- varargsを使用して静的に表される(CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)形式のシグネチャ多相パラメータ・リスト。- 戻り値:
- 証人値である署名多相結果。成功した場合、
expectedValueと同じになり、Objectを使用して静的に表されます。 - 例外:
UnsupportedOperationException- このVarHandleでアクセス・モードがサポートされていない場合。WrongMethodTypeException- アクセス・モード・タイプがコール元のシンボリック型記述子と互換性がない場合。ClassCastException- アクセス・モード・タイプがコール元のシンボリック型記述子と互換性があるが、参照キャストが失敗した場合。- 関連項目:
setVolatile(Object...),getVolatile(Object...)
-
compareAndExchangeAcquire
public final Object compareAndExchangeAcquire(Object... args)
変数の現在の値(getAcquire(java.lang.Object...)のメモリー・セマンティクスでアクセスされるexpectedValueのwitness value、==)が、getAcquire(java.lang.Object...)のメモリー・セマンティクスでアクセスされる場合は、set(java.lang.Object...)のメモリー・セマンティクスで変数の値をnewValueに設定します。メソッド・シグネチャの形式は、
(CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)Tです。compareAndExchangeAcquireのコール・サイトのシンボリック型記述子は、このVarHandleでaccessModeType(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_ACQUIRE)をコールした結果であるアクセス・モード型と一致する必要があります。- パラメータ:
args- varargsを使用して静的に表される(CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)形式のシグネチャ多相パラメータ・リスト。- 戻り値:
- 証人値である署名多相結果。成功した場合、
expectedValueと同じになり、Objectを使用して静的に表されます。 - 例外:
UnsupportedOperationException- このVarHandleでアクセス・モードがサポートされていない場合。WrongMethodTypeException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致しない場合。ClassCastException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致するが、参照キャストが失敗した場合。- 関連項目:
set(Object...),getAcquire(Object...)
-
compareAndExchangeRelease
public final Object compareAndExchangeRelease(Object... args)
変数の現在の値(get(java.lang.Object...)のメモリー・セマンティクスでアクセスされるexpectedValueのwitness value、==)が、get(java.lang.Object...)のメモリー・セマンティクスでアクセスされる場合は、setRelease(java.lang.Object...)のメモリー・セマンティクスで変数の値をnewValueに設定します。メソッド・シグネチャの形式は、
(CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)Tです。compareAndExchangeReleaseのコール・サイトのシンボリック型記述子は、このVarHandleでaccessModeType(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE)をコールした結果であるアクセス・モード型と一致する必要があります。- パラメータ:
args- varargsを使用して静的に表される(CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)形式のシグネチャ多相パラメータ・リスト。- 戻り値:
- 証人値である署名多相結果。成功した場合、
expectedValueと同じになり、Objectを使用して静的に表されます。 - 例外:
UnsupportedOperationException- このVarHandleでアクセス・モードがサポートされていない場合。WrongMethodTypeException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致しない場合。ClassCastException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致するが、参照キャストが失敗した場合。- 関連項目:
setRelease(Object...),get(Object...)
-
weakCompareAndSetPlain
public final boolean weakCompareAndSetPlain(Object... args)
変数の現在の値(get(java.lang.Object...)のメモリー・セマンティクスでアクセスされるexpectedValueをwitness value、==と呼びます)が、set(java.lang.Object...)のセマンティクスを使用して、変数の値をnewValueに原子的に設定します。証人値が予想値と一致する場合でも、この操作は(通常、メモリー競合が原因で)誤って失敗する可能性があります。
メソッド・シグネチャの形式は、
(CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)booleanです。weakCompareAndSetPlainのコール・サイトのシンボリック型記述子は、このVarHandleでaccessModeType(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_PLAIN)をコールした結果であるアクセス・モード型と一致する必要があります。- パラメータ:
args- varargsを使用して静的に表される(CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)形式のシグネチャ多相パラメータ・リスト。- 戻り値:
- 成功した場合は
true、成功した場合はfalse、証人値がexpectedValueと同じでない場合、またはこの操作に誤って失敗した場合はfalse。 - 例外:
UnsupportedOperationException- このVarHandleでアクセス・モードがサポートされていない場合。WrongMethodTypeException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致しない場合。ClassCastException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致するが、参照キャストが失敗した場合。- 関連項目:
set(Object...),get(Object...)
-
weakCompareAndSet
public final boolean weakCompareAndSet(Object... args)
変数の現在の値(getVolatile(java.lang.Object...)のメモリー・セマンティクスでアクセスされるexpectedValueのwitness value、==)が、getVolatile(java.lang.Object...)のメモリー・セマンティクスでアクセスされる場合は、setVolatile(java.lang.Object...)のメモリー・セマンティクスで変数の値をnewValueに原子的に設定します。証人値が予想値と一致する場合でも、この操作は(通常、メモリー競合が原因で)誤って失敗する可能性があります。
メソッド・シグネチャの形式は、
(CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)booleanです。weakCompareAndSetのコール・サイトのシンボリック型記述子は、このVarHandleでaccessModeType(VarHandle.AccessMode.WEAK_COMPARE_AND_SET)をコールした結果であるアクセス・モード型と一致する必要があります。- パラメータ:
args- varargsを使用して静的に表される(CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)形式のシグネチャ多相パラメータ・リスト。- 戻り値:
- 成功した場合は
true、成功した場合はfalse、証人値がexpectedValueと同じでない場合、またはこの操作に誤って失敗した場合はfalse。 - 例外:
UnsupportedOperationException- このVarHandleでアクセス・モードがサポートされていない場合。WrongMethodTypeException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致しない場合。ClassCastException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致するが、参照キャストが失敗した場合。- 関連項目:
setVolatile(Object...),getVolatile(Object...)
-
weakCompareAndSetAcquire
public final boolean weakCompareAndSetAcquire(Object... args)
変数の現在の値(getAcquire(java.lang.Object...)のメモリー・セマンティクスでアクセスされるexpectedValueをwitness value、==と呼びます)が、set(java.lang.Object...)のセマンティクスを使用して、変数の値をnewValueに原子的に設定します。証人値が予想値と一致する場合でも、この操作は(通常、メモリー競合が原因で)誤って失敗する可能性があります。
メソッド・シグネチャの形式は、
(CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)booleanです。weakCompareAndSetAcquireのコール・サイトのシンボリック型記述子は、このVarHandleでaccessModeType(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE)をコールした結果であるアクセス・モード型と一致する必要があります。- パラメータ:
args- varargsを使用して静的に表される(CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)形式のシグネチャ多相パラメータ・リスト。- 戻り値:
- 成功した場合は
true、成功した場合はfalse、証人値がexpectedValueと同じでない場合、またはこの操作に誤って失敗した場合はfalse。 - 例外:
UnsupportedOperationException- このVarHandleでアクセス・モードがサポートされていない場合。WrongMethodTypeException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致しない場合。ClassCastException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致するが、参照キャストが失敗した場合。- 関連項目:
set(Object...),getAcquire(Object...)
-
weakCompareAndSetRelease
public final boolean weakCompareAndSetRelease(Object... args)
変数の現在の値(get(java.lang.Object...)のメモリー・セマンティクスでアクセスされるexpectedValueをwitness value、==と呼びます)が、setRelease(java.lang.Object...)のセマンティクスを使用して、変数の値をnewValueに原子的に設定します。証人値が予想値と一致する場合でも、この操作は(通常、メモリー競合が原因で)誤って失敗する可能性があります。
メソッド・シグネチャの形式は、
(CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)booleanです。weakCompareAndSetReleaseのコール・サイトのシンボリック型記述子は、このVarHandleでaccessModeType(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)をコールした結果であるアクセス・モード型と一致する必要があります。- パラメータ:
args- varargsを使用して静的に表される(CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)形式のシグネチャ多相パラメータ・リスト。- 戻り値:
- 成功した場合は
true、成功した場合はfalse、証人値がexpectedValueと同じでない場合、またはこの操作に誤って失敗した場合はfalse。 - 例外:
UnsupportedOperationException- このVarHandleでアクセス・モードがサポートされていない場合。WrongMethodTypeException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致しない場合。ClassCastException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致するが、参照キャストが失敗した場合。- 関連項目:
setRelease(Object...),get(Object...)
-
getAndSet
public final Object getAndSet(Object... args)
setVolatile(java.lang.Object...)のメモリー・セマンティクスを使用して変数の値をnewValueに原子的に設定し、getVolatile(java.lang.Object...)のメモリー・セマンティクスを使用してアクセスされる変数の前の値を返します。メソッド・シグネチャの形式は、
(CT1 ct1, ..., CTn ctn, T newValue)Tです。getAndSetのコール・サイトのシンボリック型記述子は、このVarHandleでaccessModeType(VarHandle.AccessMode.GET_AND_SET)をコールした結果であるアクセス・モード型と一致する必要があります。- パラメータ:
args- varargsを使用して静的に表される(CT1 ct1, ..., CTn ctn, T newValue)形式のシグネチャ多相パラメータ・リスト。- 戻り値:
- 変数の前の値であるシグネチャ多相的な結果は、
Objectを使用して静的に表されます。 - 例外:
UnsupportedOperationException- このVarHandleでアクセス・モードがサポートされていない場合。WrongMethodTypeException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致しない場合。ClassCastException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致するが、参照キャストが失敗した場合。- 関連項目:
setVolatile(Object...),getVolatile(Object...)
-
getAndSetAcquire
public final Object getAndSetAcquire(Object... args)
set(java.lang.Object...)のメモリー・セマンティクスを使用して変数の値をnewValueに原子的に設定し、getAcquire(java.lang.Object...)のメモリー・セマンティクスを使用してアクセスされる変数の前の値を返します。メソッド・シグネチャの形式は、
(CT1 ct1, ..., CTn ctn, T newValue)Tです。getAndSetAcquireのコール・サイトのシンボリック型記述子は、このVarHandleでaccessModeType(VarHandle.AccessMode.GET_AND_SET_ACQUIRE)をコールした結果であるアクセス・モード型と一致する必要があります。- パラメータ:
args- varargsを使用して静的に表される(CT1 ct1, ..., CTn ctn, T newValue)形式のシグネチャ多相パラメータ・リスト。- 戻り値:
- 変数の前の値であるシグネチャ多相的な結果は、
Objectを使用して静的に表されます。 - 例外:
UnsupportedOperationException- このVarHandleでアクセス・モードがサポートされていない場合。WrongMethodTypeException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致しない場合。ClassCastException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致するが、参照キャストが失敗した場合。- 関連項目:
setVolatile(Object...),getVolatile(Object...)
-
getAndSetRelease
public final Object getAndSetRelease(Object... args)
setRelease(java.lang.Object...)のメモリー・セマンティクスを使用して変数の値をnewValueに原子的に設定し、get(java.lang.Object...)のメモリー・セマンティクスを使用してアクセスされる変数の前の値を返します。メソッド・シグネチャの形式は、
(CT1 ct1, ..., CTn ctn, T newValue)Tです。getAndSetReleaseのコール・サイトのシンボリック型記述子は、このVarHandleでaccessModeType(VarHandle.AccessMode.GET_AND_SET_RELEASE)をコールした結果であるアクセス・モード型と一致する必要があります。- パラメータ:
args- varargsを使用して静的に表される(CT1 ct1, ..., CTn ctn, T newValue)形式のシグネチャ多相パラメータ・リスト。- 戻り値:
- 変数の前の値であるシグネチャ多相的な結果は、
Objectを使用して静的に表されます。 - 例外:
UnsupportedOperationException- このVarHandleでアクセス・モードがサポートされていない場合。WrongMethodTypeException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致しない場合。ClassCastException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致するが、参照キャストが失敗した場合。- 関連項目:
setVolatile(Object...),getVolatile(Object...)
-
getAndAdd
public final Object getAndAdd(Object... args)
setVolatile(java.lang.Object...)のメモリー・セマンティクスを持つ変数の現在の値にvalueを原子的に追加し、getVolatile(java.lang.Object...)のメモリー・セマンティクスでアクセスされる変数の前の値を返します。メソッド・シグネチャの形式は、
(CT1 ct1, ..., CTn ctn, T value)Tです。getAndAddのコール・サイトのシンボリック型記述子は、このVarHandleでaccessModeType(VarHandle.AccessMode.GET_AND_ADD)をコールした結果であるアクセス・モード型と一致する必要があります。- パラメータ:
args- varargsを使用して静的に表される(CT1 ct1, ..., CTn ctn, T value)形式のシグネチャ多相パラメータ・リスト。- 戻り値:
- 変数の前の値であるシグネチャ多相的な結果は、
Objectを使用して静的に表されます。 - 例外:
UnsupportedOperationException- このVarHandleでアクセス・モードがサポートされていない場合。WrongMethodTypeException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致しない場合。ClassCastException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致するが、参照キャストが失敗した場合。- 関連項目:
setVolatile(Object...),getVolatile(Object...)
-
getAndAddAcquire
public final Object getAndAddAcquire(Object... args)
set(java.lang.Object...)のメモリー・セマンティクスを持つ変数の現在の値にvalueを原子的に追加し、getAcquire(java.lang.Object...)のメモリー・セマンティクスでアクセスされる変数の前の値を返します。メソッド・シグネチャの形式は、
(CT1 ct1, ..., CTn ctn, T value)Tです。getAndAddAcquireのコール・サイトのシンボリック型記述子は、このVarHandleでaccessModeType(VarHandle.AccessMode.GET_AND_ADD_ACQUIRE)をコールした結果であるアクセス・モード型と一致する必要があります。- パラメータ:
args- varargsを使用して静的に表される(CT1 ct1, ..., CTn ctn, T value)形式のシグネチャ多相パラメータ・リスト。- 戻り値:
- 変数の前の値であるシグネチャ多相的な結果は、
Objectを使用して静的に表されます。 - 例外:
UnsupportedOperationException- このVarHandleでアクセス・モードがサポートされていない場合。WrongMethodTypeException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致しない場合。ClassCastException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致するが、参照キャストが失敗した場合。- 関連項目:
setVolatile(Object...),getVolatile(Object...)
-
getAndAddRelease
public final Object getAndAddRelease(Object... args)
setRelease(java.lang.Object...)のメモリー・セマンティクスを持つ変数の現在の値にvalueを原子的に追加し、get(java.lang.Object...)のメモリー・セマンティクスでアクセスされる変数の前の値を返します。メソッド・シグネチャの形式は、
(CT1 ct1, ..., CTn ctn, T value)Tです。getAndAddReleaseのコール・サイトのシンボリック型記述子は、このVarHandleでaccessModeType(VarHandle.AccessMode.GET_AND_ADD_RELEASE)をコールした結果であるアクセス・モード型と一致する必要があります。- パラメータ:
args- varargsを使用して静的に表される(CT1 ct1, ..., CTn ctn, T value)形式のシグネチャ多相パラメータ・リスト。- 戻り値:
- 変数の前の値であるシグネチャ多相的な結果は、
Objectを使用して静的に表されます。 - 例外:
UnsupportedOperationException- このVarHandleでアクセス・モードがサポートされていない場合。WrongMethodTypeException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致しない場合。ClassCastException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致するが、参照キャストが失敗した場合。- 関連項目:
setVolatile(Object...),getVolatile(Object...)
-
getAndBitwiseOr
public final Object getAndBitwiseOr(Object... args)
変数の現在の値と、setVolatile(java.lang.Object...)のメモリー・セマンティクスを持つmaskの間のビット単位ORの結果に変数の値を原子的に設定し、getVolatile(java.lang.Object...)のメモリー・セマンティクスでアクセスされる変数の前の値を返します。変数の型が非整数
boolean型の場合は、ビット単位のORのかわりに論理ORが実行されます。メソッド・シグネチャの形式は、
(CT1 ct1, ..., CTn ctn, T mask)Tです。getAndBitwiseOrのコール・サイトのシンボリック型記述子は、このVarHandleでaccessModeType(VarHandle.AccessMode.GET_AND_BITWISE_OR)をコールした結果であるアクセス・モード型と一致する必要があります。- パラメータ:
args- varargsを使用して静的に表される(CT1 ct1, ..., CTn ctn, T mask)形式のシグネチャ多相パラメータ・リスト。- 戻り値:
- 変数の前の値であるシグネチャ多相的な結果は、
Objectを使用して静的に表されます。 - 例外:
UnsupportedOperationException- このVarHandleでアクセス・モードがサポートされていない場合。WrongMethodTypeException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致しない場合。ClassCastException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致するが、参照キャストが失敗した場合。- 関連項目:
setVolatile(Object...),getVolatile(Object...)
-
getAndBitwiseOrAcquire
public final Object getAndBitwiseOrAcquire(Object... args)
変数の現在の値と、set(java.lang.Object...)のメモリー・セマンティクスを持つmaskの間のビット単位ORの結果に変数の値を原子的に設定し、getAcquire(java.lang.Object...)のメモリー・セマンティクスでアクセスされる変数の前の値を返します。変数の型が非整数
boolean型の場合は、ビット単位のORのかわりに論理ORが実行されます。メソッド・シグネチャの形式は、
(CT1 ct1, ..., CTn ctn, T mask)Tです。getAndBitwiseOrAcquireのコール・サイトのシンボリック型記述子は、このVarHandleでaccessModeType(VarHandle.AccessMode.GET_AND_BITWISE_OR_ACQUIRE)をコールした結果であるアクセス・モード型と一致する必要があります。- パラメータ:
args- varargsを使用して静的に表される(CT1 ct1, ..., CTn ctn, T mask)形式のシグネチャ多相パラメータ・リスト。- 戻り値:
- 変数の前の値であるシグネチャ多相的な結果は、
Objectを使用して静的に表されます。 - 例外:
UnsupportedOperationException- このVarHandleでアクセス・モードがサポートされていない場合。WrongMethodTypeException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致しない場合。ClassCastException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致するが、参照キャストが失敗した場合。- 関連項目:
set(Object...),getAcquire(Object...)
-
getAndBitwiseOrRelease
public final Object getAndBitwiseOrRelease(Object... args)
変数の現在の値と、setRelease(java.lang.Object...)のメモリー・セマンティクスを持つmaskの間のビット単位ORの結果に変数の値を原子的に設定し、get(java.lang.Object...)のメモリー・セマンティクスでアクセスされる変数の前の値を返します。変数の型が非整数
boolean型の場合は、ビット単位のORのかわりに論理ORが実行されます。メソッド・シグネチャの形式は、
(CT1 ct1, ..., CTn ctn, T mask)Tです。getAndBitwiseOrReleaseのコール・サイトのシンボリック型記述子は、このVarHandleでaccessModeType(VarHandle.AccessMode.GET_AND_BITWISE_OR_RELEASE)をコールした結果であるアクセス・モード型と一致する必要があります。- パラメータ:
args- varargsを使用して静的に表される(CT1 ct1, ..., CTn ctn, T mask)形式のシグネチャ多相パラメータ・リスト。- 戻り値:
- 変数の前の値であるシグネチャ多相的な結果は、
Objectを使用して静的に表されます。 - 例外:
UnsupportedOperationException- このVarHandleでアクセス・モードがサポートされていない場合。WrongMethodTypeException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致しない場合。ClassCastException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致するが、参照キャストが失敗した場合。- 関連項目:
setRelease(Object...),get(Object...)
-
getAndBitwiseAnd
public final Object getAndBitwiseAnd(Object... args)
変数の現在の値と、setVolatile(java.lang.Object...)のメモリー・セマンティクスを持つmaskの間のビット単位ANDの結果に変数の値を原子的に設定し、getVolatile(java.lang.Object...)のメモリー・セマンティクスでアクセスされる変数の前の値を返します。変数の型が非整数
boolean型の場合は、ビット単位のANDのかわりに論理ANDが実行されます。メソッド・シグネチャの形式は、
(CT1 ct1, ..., CTn ctn, T mask)Tです。getAndBitwiseAndのコール・サイトのシンボリック型記述子は、このVarHandleでaccessModeType(VarHandle.AccessMode.GET_AND_BITWISE_AND)をコールした結果であるアクセス・モード型と一致する必要があります。- パラメータ:
args- varargsを使用して静的に表される(CT1 ct1, ..., CTn ctn, T mask)形式のシグネチャ多相パラメータ・リスト。- 戻り値:
- 変数の前の値であるシグネチャ多相的な結果は、
Objectを使用して静的に表されます。 - 例外:
UnsupportedOperationException- このVarHandleでアクセス・モードがサポートされていない場合。WrongMethodTypeException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致しない場合。ClassCastException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致するが、参照キャストが失敗した場合。- 関連項目:
setVolatile(Object...),getVolatile(Object...)
-
getAndBitwiseAndAcquire
public final Object getAndBitwiseAndAcquire(Object... args)
変数の現在の値と、set(java.lang.Object...)のメモリー・セマンティクスを持つmaskの間のビット単位ANDの結果に変数の値を原子的に設定し、getAcquire(java.lang.Object...)のメモリー・セマンティクスでアクセスされる変数の前の値を返します。変数の型が非整数
boolean型の場合は、ビット単位のANDのかわりに論理ANDが実行されます。メソッド・シグネチャの形式は、
(CT1 ct1, ..., CTn ctn, T mask)Tです。getAndBitwiseAndAcquireのコール・サイトのシンボリック型記述子は、このVarHandleでaccessModeType(VarHandle.AccessMode.GET_AND_BITWISE_AND_ACQUIRE)をコールした結果であるアクセス・モード型と一致する必要があります。- パラメータ:
args- varargsを使用して静的に表される(CT1 ct1, ..., CTn ctn, T mask)形式のシグネチャ多相パラメータ・リスト。- 戻り値:
- 変数の前の値であるシグネチャ多相的な結果は、
Objectを使用して静的に表されます。 - 例外:
UnsupportedOperationException- このVarHandleでアクセス・モードがサポートされていない場合。WrongMethodTypeException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致しない場合。ClassCastException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致するが、参照キャストが失敗した場合。- 関連項目:
set(Object...),getAcquire(Object...)
-
getAndBitwiseAndRelease
public final Object getAndBitwiseAndRelease(Object... args)
変数の現在の値と、setRelease(java.lang.Object...)のメモリー・セマンティクスを持つmaskの間のビット単位ANDの結果に変数の値を原子的に設定し、get(java.lang.Object...)のメモリー・セマンティクスでアクセスされる変数の前の値を返します。変数の型が非整数
boolean型の場合は、ビット単位のANDのかわりに論理ANDが実行されます。メソッド・シグネチャの形式は、
(CT1 ct1, ..., CTn ctn, T mask)Tです。getAndBitwiseAndReleaseのコール・サイトのシンボリック型記述子は、このVarHandleでaccessModeType(VarHandle.AccessMode.GET_AND_BITWISE_AND_RELEASE)をコールした結果であるアクセス・モード型と一致する必要があります。- パラメータ:
args- varargsを使用して静的に表される(CT1 ct1, ..., CTn ctn, T mask)形式のシグネチャ多相パラメータ・リスト。- 戻り値:
- 変数の前の値であるシグネチャ多相的な結果は、
Objectを使用して静的に表されます。 - 例外:
UnsupportedOperationException- このVarHandleでアクセス・モードがサポートされていない場合。WrongMethodTypeException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致しない場合。ClassCastException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致するが、参照キャストが失敗した場合。- 関連項目:
setRelease(Object...),get(Object...)
-
getAndBitwiseXor
public final Object getAndBitwiseXor(Object... args)
変数の現在の値と、setVolatile(java.lang.Object...)のメモリー・セマンティクスを持つmaskの間のビット単位のXORの結果に変数の値を原子的に設定し、getVolatile(java.lang.Object...)のメモリー・セマンティクスでアクセスされる変数の前の値を返します。変数の型が非整数
boolean型の場合は、ビット単位のXORのかわりに論理XORが実行されます。メソッド・シグネチャの形式は、
(CT1 ct1, ..., CTn ctn, T mask)Tです。getAndBitwiseXorのコール・サイトのシンボリック型記述子は、このVarHandleでaccessModeType(VarHandle.AccessMode.GET_AND_BITWISE_XOR)をコールした結果であるアクセス・モード型と一致する必要があります。- パラメータ:
args- varargsを使用して静的に表される(CT1 ct1, ..., CTn ctn, T mask)形式のシグネチャ多相パラメータ・リスト。- 戻り値:
- 変数の前の値であるシグネチャ多相的な結果は、
Objectを使用して静的に表されます。 - 例外:
UnsupportedOperationException- このVarHandleでアクセス・モードがサポートされていない場合。WrongMethodTypeException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致しない場合。ClassCastException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致するが、参照キャストが失敗した場合。- 関連項目:
setVolatile(Object...),getVolatile(Object...)
-
getAndBitwiseXorAcquire
public final Object getAndBitwiseXorAcquire(Object... args)
変数の現在の値と、set(java.lang.Object...)のメモリー・セマンティクスを持つmaskの間のビット単位のXORの結果に変数の値を原子的に設定し、getAcquire(java.lang.Object...)のメモリー・セマンティクスでアクセスされる変数の前の値を返します。変数の型が非整数
boolean型の場合は、ビット単位のXORのかわりに論理XORが実行されます。メソッド・シグネチャの形式は、
(CT1 ct1, ..., CTn ctn, T mask)Tです。getAndBitwiseXorAcquireのコール・サイトのシンボリック型記述子は、このVarHandleでaccessModeType(VarHandle.AccessMode.GET_AND_BITWISE_XOR_ACQUIRE)をコールした結果であるアクセス・モード型と一致する必要があります。- パラメータ:
args- varargsを使用して静的に表される(CT1 ct1, ..., CTn ctn, T mask)形式のシグネチャ多相パラメータ・リスト。- 戻り値:
- 変数の前の値であるシグネチャ多相的な結果は、
Objectを使用して静的に表されます。 - 例外:
UnsupportedOperationException- このVarHandleでアクセス・モードがサポートされていない場合。WrongMethodTypeException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致しない場合。ClassCastException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致するが、参照キャストが失敗した場合。- 関連項目:
set(Object...),getAcquire(Object...)
-
getAndBitwiseXorRelease
public final Object getAndBitwiseXorRelease(Object... args)
変数の現在の値と、setRelease(java.lang.Object...)のメモリー・セマンティクスを持つmaskの間のビット単位のXORの結果に変数の値を原子的に設定し、get(java.lang.Object...)のメモリー・セマンティクスでアクセスされる変数の前の値を返します。変数の型が非整数
boolean型の場合は、ビット単位のXORのかわりに論理XORが実行されます。メソッド・シグネチャの形式は、
(CT1 ct1, ..., CTn ctn, T mask)Tです。getAndBitwiseXorReleaseのコール・サイトのシンボリック型記述子は、このVarHandleでaccessModeType(VarHandle.AccessMode.GET_AND_BITWISE_XOR_RELEASE)をコールした結果であるアクセス・モード型と一致する必要があります。- パラメータ:
args- varargsを使用して静的に表される(CT1 ct1, ..., CTn ctn, T mask)形式のシグネチャ多相パラメータ・リスト。- 戻り値:
- 変数の前の値であるシグネチャ多相的な結果は、
Objectを使用して静的に表されます。 - 例外:
UnsupportedOperationException- このVarHandleでアクセス・モードがサポートされていない場合。WrongMethodTypeException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致しない場合。ClassCastException- アクセス・モード・タイプがコール元のシンボリック型記述子と一致するが、参照キャストが失敗した場合。- 関連項目:
setRelease(Object...),get(Object...)
-
varType
public final Class<?> varType()
このVarHandleによって参照される変数の変数型を返します。- 戻り値:
- このVarHandleによって参照される変数の変数型
-
coordinateTypes
public final List<Class<?>> coordinateTypes()
このVarHandleの座標型を返します。- 戻り値:
- このVarHandleの座標型。 返されたリストは変更できません
-
accessModeType
public final MethodType accessModeType(VarHandle.AccessMode accessMode)
このVarHandleおよび指定されたアクセス・モードのアクセス・モード・タイプを取得します。アクセス・モード・タイプのパラメータ・タイプは、このVarHandleの座標型である接頭辞と、その後にアクセス・モード・メソッドで定義されたその他の型で構成されます。 アクセス・モード・タイプの戻り型は、アクセス・モード・メソッドの戻り型によって定義されます。
- パラメータ:
accessMode- 同じ名前のシグネチャ多相メソッドに対応するアクセス・モード- 戻り値:
- 指定されたアクセス・モードのアクセス・モード・タイプ
-
isAccessModeSupported
public final boolean isAccessModeSupported(VarHandle.AccessMode accessMode)
指定されたアクセス・モードがサポートされている場合はtrueを戻し、それ以外の場合はfalseを戻します。特定のアクセス・モードに対する
false値の戻り値は、対応するアクセス・モード・メソッドの起動時にUnsupportedOperationExceptionがスローされることを示します。- パラメータ:
accessMode- 同じ名前のシグネチャ多相メソッドに対応するアクセス・モード- 戻り値:
- 指定されたアクセス・モードがサポートされている場合は
true、それ以外の場合はfalse。
-
toMethodHandle
public final MethodHandle toMethodHandle(VarHandle.AccessMode accessMode)
このVarHandleおよび指定されたアクセス・モードにバインドされたメソッド・ハンドルを取得します。- APIのノート:
- このメソッドは、VarHandle
vhおよびアクセス・モード{access-mode}の場合、次のコードのメソッド・ハンドルbmhと同等のメソッド・ハンドルを返します(ただし、より効率的です)。MethodHandle mh = MethodHandles.varHandleExactInvoker( vh.accessModeType(VarHandle.AccessMode.{access-mode})); MethodHandle bmh = mh.bindTo(vh); - パラメータ:
accessMode- 同じ名前のシグネチャ多相メソッドに対応するアクセス・モード- 戻り値:
- このVarHandleおよび指定されたアクセス・モードにバインドされたメソッド・ハンドル
-
fullFence
public static void fullFence()
フェンスの前のロードおよびストアが、フェンスの後のロードおよびストアで並べ替えられないようにします。- APIのノート:
- CおよびC++とのセマンティクスの多くの違いを無視します。このメソッドには、
atomic_thread_fence(memory_order_seq_cst)と互換性のあるメモリー順序付け効果があります
-
acquireFence
public static void acquireFence()
フェンスの前のロードが、フェンスの後のロードおよびストアで並べ替えられないようにします。- APIのノート:
- CおよびC++とのセマンティクスの多くの違いを無視します。このメソッドには、
atomic_thread_fence(memory_order_acquire)と互換性のあるメモリー順序付け効果があります
-
releaseFence
public static void releaseFence()
フェンスの前のロードおよび格納が、フェンスの後の店舗で並べ替えられないようにします。- APIのノート:
- CおよびC++とのセマンティクスの多くの違いを無視します。このメソッドには、
atomic_thread_fence(memory_order_release)と互換性のあるメモリー順序付け効果があります
-
loadLoadFence
public static void loadLoadFence()
フェンスの前の荷重が、フェンスの後の荷重で並べ替えられないようにします。
-
storeStoreFence
public static void storeStoreFence()
フェンスの前のストアが、フェンスの後のストアで並べ替えられないようにします。
-
-