Module java.base
Package java.lang.invoke

Class VolatileCallSite

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

public non-sealed class VolatileCallSite extends CallSite
一个VolatileCallSite是一个CallSite,其目标行为类似于一个volatile变量。链接到VolatileCallSiteinvokedynamic指令会立即看到其调用目标的更新,即使更新发生在另一个线程中。这种线程之间的紧密耦合可能会导致性能损失。

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

在其他方面,VolatileCallSiteMutableCallSite是可互换的。

自Java版本:
1.7
参见:
  • Constructor Details

    • VolatileCallSite

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

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

    • getTarget

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

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

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

      在类中指定:
      getTarget 在类 CallSite
      返回:
      此调用站点的链接状态,一个随时间可能会更改的方法句柄
      参见:
    • 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
      返回:
      一个方法句柄,始终调用此调用站点的当前目标