java.lang.Object
java.lang.invoke.CallSite
java.lang.invoke.VolatileCallSite
一个
VolatileCallSite
是一个CallSite
,其目标行为类似于一个volatile变量。链接到VolatileCallSite
的invokedynamic
指令会立即看到其调用目标的更新,即使更新发生在另一个线程中。这种线程之间的紧密耦合可能会导致性能损失。
与MutableCallSite
不同,对于volatile调用站点,没有syncAll操作,因为对volatile变量的每次写入都会隐式地与读取线程同步。
在其他方面,VolatileCallSite
与MutableCallSite
是可互换的。
- 自Java版本:
- 1.7
- 参见:
-
Constructor Summary
ConstructorDescriptionVolatileCallSite
(MethodHandle target) 创建一个与其目标具有volatile绑定的调用站点。VolatileCallSite
(MethodType type) 创建一个与其目标具有volatile绑定的调用站点。 -
Method Summary
Modifier and TypeMethodDescriptionfinal MethodHandle
生成一个等效于已链接到此调用站点的invokedynamic指令的方法句柄。final MethodHandle
返回调用站点的目标方法,其行为类似于VolatileCallSite
的volatile
字段。void
setTarget
(MethodHandle newTarget) 更新此调用站点的目标方法,作为一个volatile变量。
-
Constructor Details
-
VolatileCallSite
创建一个与其目标具有volatile绑定的调用站点。初始目标设置为给定类型的方法句柄,如果调用则会抛出IllegalStateException
。- 参数:
-
type
- 此调用站点将具有的方法类型 - 抛出:
-
NullPointerException
- 如果提议的类型为null
-
VolatileCallSite
创建一个与其目标具有volatile绑定的调用站点。目标设置为给定值。- 参数:
-
target
- 将作为调用站点的初始目标的方法句柄 - 抛出:
-
NullPointerException
- 如果提议的目标为null
-
-
Method Details
-
getTarget
返回调用站点的目标方法,其行为类似于VolatileCallSite
的volatile
字段。getTarget
与内存的交互与从volatile
字段读取的操作相同。特别是,当前线程需要从内存发出目标的新读取,并且不能忽略另一个线程最近对目标的更新。
-
setTarget
更新此调用站点的目标方法,作为一个volatile变量。新目标的类型必须与旧目标的类型一致。与内存的交互与写入volatile字段的操作相同。特别是,任何线程都保证在下一次调用
getTarget
时看到更新后的目标。- 在类中指定:
-
setTarget
在类CallSite
中 - 参数:
-
newTarget
- 新目标 - 抛出:
-
NullPointerException
- 如果提议的新目标为null -
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
中 - 返回:
- 一个方法句柄,始终调用此调用站点的当前目标
-