java.lang.Object
java.lang.invoke.CallSite
java.lang.invoke.VolatileCallSite
VolatileCallSite 是一个 CallSite ,其目标就像一个易变变量。链接到 VolatileCallSite 的 invokedynamic 指令会立即看到对其调用站点目标的更新,即使更新发生在另一个线程中也是如此。线程之间的这种紧密耦合可能会降低性能。
与 MutableCallSite 不同,volatile 调用站点上没有 同步所有操作,因为对 volatile 变量的每次写入都与读取器线程隐式同步。
在其他方面,VolatileCallSite 可与 MutableCallSite 互换。
- 自从:
- 1.7
- 参见:
-
构造方法总结
构造方法构造方法描述VolatileCallSite(MethodHandle target) 创建一个与其目标具有可变绑定的调用站点。VolatileCallSite(MethodType type) 创建一个与其目标具有可变绑定的调用站点。 -
方法总结
修饰符和类型方法描述final MethodHandle生成等效于已链接到此调用站点的 invokedynamic 指令的方法句柄。final MethodHandle返回调用站点的目标方法,其行为类似于VolatileCallSite的volatile字段。voidsetTarget(MethodHandle newTarget) 将此调用站点的目标方法更新为易失性变量。
-
构造方法详细信息
-
VolatileCallSite
创建一个与其目标具有可变绑定的调用站点。初始目标设置为给定类型的方法句柄,如果调用它将抛出IllegalStateException。- 参数:
type- 此调用站点将具有的方法类型- 抛出:
NullPointerException- 如果建议的类型为 null
-
VolatileCallSite
创建一个与其目标具有可变绑定的调用站点。目标设置为给定值。- 参数:
target- 将成为调用站点初始目标的方法句柄- 抛出:
NullPointerException- 如果提议的目标为空
-
-
方法详情
-
getTarget
返回调用站点的目标方法,其行为类似于VolatileCallSite的volatile字段。getTarget与内存的交互与从volatile字段读取的交互相同。特别是,当前线程需要从内存中发出对目标的全新读取,并且一定不能看不到另一个线程对目标的最近更新。
-
setTarget
将此调用站点的目标方法更新为易失性变量。新目标的类型必须与旧目标的类型一致。与内存的交互与写入易失性字段相同。特别是,保证任何线程在下次调用
getTarget时都能看到更新的目标。- 指定者:
setTarget在类CallSite中- 参数:
newTarget- 新目标- 抛出:
NullPointerException- 如果提议的新目标为空WrongMethodTypeException- 如果提议的新目标的方法类型与之前的目标不同- 参见:
-
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中- 返回:
- 始终调用此调用站点的当前目标的方法句柄
-