モジュール java.base
パッケージ java.lang.invoke

クラスVolatileCallSite



  • public class VolatileCallSite
    extends CallSite
    VolatileCallSiteは、ターゲットの動作がvolatile変数と同じであるようなCallSiteです。 VolatileCallSiteにリンクされたinvokedynamic命令は、そのコール・サイト・ターゲットへの更新が別のスレッドで発生した場合でも、その更新を即時に認識します。 そうしたスレッド間の緊密な結合のため、パフォーマンス低下が発生する可能性があります。

    揮発性コール・サイトではMutableCallSiteと違ってsyncAll操作が存在しませんが、これは、volatile変数への書込みがすべてリーダー・スレッドに暗黙的に同期されるからです。

    その他の点では、VolatileCallSiteMutableCallSiteと交換可能です。

    導入されたバージョン:
    1.7
    関連項目:
    MutableCallSite
    • コンストラクタの詳細

      • VolatileCallSite

        public VolatileCallSite​(MethodType type)
        ターゲットへのvolatileバインディングを持つコール・サイトを作成します。 初期ターゲットは、呼出し時にIllegalStateExceptionをスローするような、指定された型のメソッド・ハンドルに設定されます。
        パラメータ:
        type - このコール・サイトのメソッド型
        例外:
        NullPointerException - 提案された型がnullの場合
      • VolatileCallSite

        public VolatileCallSite​(MethodHandle target)
        ターゲットへのvolatileバインディングを持つコール・サイトを作成します。 ターゲットは指定された値に設定されます。
        パラメータ:
        target - コール・サイトの初期ターゲットとなるメソッド・ハンドル
        例外:
        NullPointerException - 提案されたターゲットがnullの場合
    • メソッドの詳細

      • getTarget

        public final MethodHandle getTarget​()
        コール・サイトのターゲット・メソッドを返しますが、これは、VolatileCallSitevolatileフィールドのように振る舞います。

        getTargetのメモリーとの相互作用は、volatileフィールドから読取りを行う場合と同じです。

        特に、現在のスレッドはメモリーからのターゲットの新しい読取りを発行する必要があり、別のスレッドによるターゲットへの最新の更新を確認する必要があります。

        定義:
        getTarget、クラス: CallSite
        戻り値:
        このコール・サイトのリンケージ状態(時間とともに変わる可能性のあるメソッド・ハンドル)
        関連項目:
        setTarget(java.lang.invoke.MethodHandle)
      • setTarget

        public void setTarget​(MethodHandle newTarget)
        このコール・サイトのターゲット・メソッドをvolatile変数として更新します。 新しいターゲットの型は古いターゲットの型と同じでなければいけません。

        メモリーとの相互作用は、volatileフィールドに書込みを行う場合と同じです。 具体的には、次回のgetTarget呼出し時に更新後のターゲットを得られることが、すべてのスレッドで保証されます。

        定義:
        setTarget、クラス: CallSite
        パラメータ:
        newTarget - 新しいターゲット
        例外:
        NullPointerException - 提案された新しいターゲットがnullの場合
        WrongMethodTypeException - 提案された新しいターゲットのメソッド型が以前のターゲットと異なる場合
        関連項目:
        getTarget()
      • 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
        戻り値:
        このコール・サイトの現在のターゲットを常に呼び出すメソッド・ハンドル