模块 java.base

类 VolatileCallSite

java.lang.Object
java.lang.invoke.CallSite
java.lang.invoke.VolatileCallSite

public non-sealed class VolatileCallSite extends CallSite
VolatileCallSite 是一个 CallSite ,其目标就像一个易变变量。链接到 VolatileCallSiteinvokedynamic 指令会立即看到对其调用站点目标的更新,即使更新发生在另一个线程中也是如此。线程之间的这种紧密耦合可能会降低性能。

MutableCallSite 不同,volatile 调用站点上没有 同步所有操作,因为对 volatile 变量的每次写入都与读取器线程隐式同步。

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

自从:
1.7
参见:
  • 构造方法详细信息

    • VolatileCallSite

      public VolatileCallSite(MethodType  type)
      创建一个与其目标具有可变绑定的调用站点。初始目标设置为给定类型的方法句柄,如果调用它将抛出 IllegalStateException
      参数:
      type - 此调用站点将具有的方法类型
      抛出:
      NullPointerException - 如果建议的类型为 null
    • VolatileCallSite

      public VolatileCallSite(MethodHandle  target)
      创建一个与其目标具有可变绑定的调用站点。目标设置为给定值。
      参数:
      target - 将成为调用站点初始目标的方法句柄
      抛出:
      NullPointerException - 如果提议的目标为空
  • 方法详情

    • getTarget

      public final MethodHandle  getTarget()
      返回调用站点的目标方法,其行为类似于 VolatileCallSitevolatile 字段。

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

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

      指定者:
      getTarget 在类 CallSite
      返回:
      此调用站点的链接状态,一个可以随时间变化的方法句柄
      参见:
    • setTarget

      public void setTarget(MethodHandle  newTarget)
      将此调用站点的目标方法更新为易失性变量。新目标的类型必须与旧目标的类型一致。

      与内存的交互与写入易失性字段相同。特别是,保证任何线程在下次调用 getTarget 时都能看到更新的目标。

      指定者:
      setTarget 在类 CallSite
      参数:
      newTarget - 新目标
      抛出:
      NullPointerException - 如果提议的新目标为空
      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
      返回:
      始终调用此调用站点的当前目标的方法句柄