Module  java.base
软件包  java.lang.invoke

Class VolatileCallSite



  • public class VolatileCallSite
    extends CallSite
    A VolatileCallSite是一个CallSite其目标像一个volatile变量。 链接到VolatileCallSiteinvokedynamic指令即使在另一个线程中发生更新,也会立即查看其呼叫站点目标的更新。 螺纹之间的这种紧密耦合可能会造成性能损失。

    MutableCallSite不同,在易失性调用站点上没有syncAll operation ,因为对易失性变量的每次写入都与读取器线程隐式同步。

    在其他方面, VolatileCallSite可与MutableCallSite互换。

    从以下版本开始:
    1.7
    另请参见:
    MutableCallSite
    • 构造方法详细信息

      • VolatileCallSite

        public VolatileCallSite​(MethodType type)
        创建一个具有对其目标的易失性绑定的调用站点。 初始目标设置为给定类型的方法句柄,如果调用该方法句柄将抛出一个IllegalStateException
        参数
        type - 此呼叫站点将具有的方法类型
        异常
        NullPointerException - 如果提议的类型为空
      • VolatileCallSite

        public VolatileCallSite​(MethodHandle target)
        创建一个具有对其目标的易失性绑定的调用站点。 目标设置为给定的值。
        参数
        target - 将作为呼叫站点初始目标的方法句柄
        异常
        NullPointerException - 如果提议的目标为null
    • 方法详细信息

      • getTarget

        public final MethodHandle getTarget​()
        返回调用点,其行为类似于目标方法volatile的领域VolatileCallSite

        getTarget与内存的交互与volatile字段的读取相同。

        特别地,当前线程需要从内存中发出目标的新鲜读取,并且不能看不到另一个线程对目标的最新更新。

        Specified by:
        getTargetCallSite
        结果
        此呼叫站点的链接状态,可随时间变化的方法句柄
        另请参见:
        setTarget(java.lang.invoke.MethodHandle)
      • setTarget

        public void setTarget​(MethodHandle newTarget)
        将此调用站点的目标方法更新为volatile变量。 新目标的类型必须符合旧目标的类型。

        与存储器的交互与对易失性字段的写入相同。 特别地,任何线程在下一次调用getTarget时都可以看到更新的目标。

        Specified by:
        setTargetCallSite
        参数
        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)
         
        Specified by:
        dynamicInvokerCallSite
        结果
        总是调用此调用站点的当前目标的方法句柄