java.lang.Object
java.lang.invoke.CallSite
java.lang.invoke.VolatileCallSite
public non-sealed class VolatileCallSite extends CallSite
VolatileCallSite
は、ターゲットの動作がvolatile変数と同じであるようなCallSite
です。 VolatileCallSite
にリンクされたinvokedynamic
命令は、そのコール・サイト・ターゲットへの更新が別のスレッドで発生した場合でも、その更新を即時に認識します。 そうしたスレッド間の緊密な結合のため、パフォーマンス低下が発生する可能性があります。
揮発性コール・サイトではMutableCallSite
と違ってsyncAll操作が存在しませんが、これは、volatile変数への書込みがすべてリーダー・スレッドに暗黙的に同期されるからです。
その他の点では、VolatileCallSite
はMutableCallSite
と交換可能です。
- 導入されたバージョン:
- 1.7
- 関連項目:
-
コンストラクタのサマリー
コンストラクタ説明VolatileCallSite
(MethodHandle target) ターゲットへのvolatileバインディングを持つコール・サイトを作成します。VolatileCallSite
(MethodType type) ターゲットへのvolatileバインディングを持つコール・サイトを作成します。 -
メソッドのサマリー
修飾子と型メソッド説明final MethodHandle
このコール・サイトにリンクされているinvokedynamic命令と同等のメソッド・ハンドルを生成します。final MethodHandle
コール・サイトのターゲット・メソッドを返しますが、これは、VolatileCallSite
のvolatile
フィールドのように振る舞います。void
setTarget
(MethodHandle newTarget) このコール・サイトのターゲット・メソッドをvolatile変数として更新します。
-
コンストラクタの詳細
-
VolatileCallSite
public VolatileCallSite(MethodType type) ターゲットへのvolatileバインディングを持つコール・サイトを作成します。 初期ターゲットは、呼出し時にIllegalStateException
をスローするような、指定された型のメソッド・ハンドルに設定されます。- パラメータ:
type
- このコール・サイトのメソッド型- 例外:
NullPointerException
- 提案された型がnullの場合
-
VolatileCallSite
public VolatileCallSite(MethodHandle target) ターゲットへのvolatileバインディングを持つコール・サイトを作成します。 ターゲットは指定された値に設定されます。- パラメータ:
target
- コール・サイトの初期ターゲットとなるメソッド・ハンドル- 例外:
NullPointerException
- 提案されたターゲットがnullの場合
-
-
メソッドの詳細
-
getTarget
public final MethodHandle getTarget()コール・サイトのターゲット・メソッドを返しますが、これは、VolatileCallSite
のvolatile
フィールドのように振る舞います。getTarget
のメモリーとの相互作用は、volatile
フィールドから読取りを行う場合と同じです。特に、現在のスレッドはメモリーからのターゲットの新しい読取りを発行する必要があり、別のスレッドによるターゲットへの最新の更新を確認する必要があります。
-
setTarget
public void setTarget(MethodHandle newTarget) このコール・サイトのターゲット・メソッドをvolatile変数として更新します。 新しいターゲットの型は古いターゲットの型と同じでなければいけません。メモリーとの相互作用は、volatileフィールドに書込みを行う場合と同じです。 具体的には、次回の
getTarget
呼出し時に更新後のターゲットを得られることが、すべてのスレッドで保証されます。- 定義:
setTarget
、クラスCallSite
- パラメータ:
newTarget
- 新しいターゲット- 例外:
NullPointerException
- 提案された新しいターゲットがnullの場合WrongMethodTypeException
- 提案された新しいターゲットのメソッド型が以前のターゲットと異なる場合- 関連項目:
-
dynamicInvoker
public final MethodHandle dynamicInvoker()このコール・サイトにリンクされているinvokedynamic命令と同等のメソッド・ハンドルを生成します。このメソッドは次のコードと同等です。
MethodHandle getTarget, invoker, result; getTarget = MethodHandles.publicLookup().bind(this, "getTarget", MethodType.methodType(MethodHandle.class)); invoker = MethodHandles.exactInvoker(this.type()); result = MethodHandles.foldArguments(invoker, getTarget)
- 定義:
dynamicInvoker
、クラスCallSite
- 戻り値:
- このコール・サイトの現在のターゲットを常に呼び出すメソッド・ハンドル
-