- java.lang.Object
-
- java.lang.invoke.CallSite
-
- java.lang.invoke.VolatileCallSite
-
public class VolatileCallSite extends CallSite
AVolatileCallSite
是一个CallSite
,其目标像一个volatile变量。 链接到VolatileCallSite
的invokedynamic
指令即使在另一个线程中发生更新,也会立即查看其呼叫站点目标的更新。 螺纹之间的这种紧密耦合可能会造成性能损失。与
MutableCallSite
不同,在易失性调用站点上没有syncAll operation ,因为对易失性变量的每次写入都与读取器线程隐式同步。在其他方面,
VolatileCallSite
可与MutableCallSite
互换。- 从以下版本开始:
- 1.7
- 另请参见:
-
MutableCallSite
-
-
构造方法摘要
构造方法 Constructor 描述 VolatileCallSite(MethodHandle target)
创建一个具有对其目标的易失性绑定的调用站点。VolatileCallSite(MethodType type)
创建一个具有对其目标的易失性绑定的调用站点。
-
方法摘要
所有方法 接口方法 具体的方法 Modifier and Type 方法 描述 MethodHandle
dynamicInvoker()
生成等效于已经链接到此调用站点的invokedynamic指令的方法句柄。MethodHandle
getTarget()
返回调用点,其行为类似于目标方法volatile
的领域VolatileCallSite
。void
setTarget(MethodHandle newTarget)
将此调用站点的目标方法更新为volatile变量。
-
-
-
构造方法详细信息
-
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:
-
getTarget
在CallSite
- 结果
- 此呼叫站点的链接状态,可随时间变化的方法句柄
- 另请参见:
-
setTarget(java.lang.invoke.MethodHandle)
-
setTarget
public void setTarget(MethodHandle newTarget)
将此调用站点的目标方法更新为volatile变量。 新目标的类型必须符合旧目标的类型。与存储器的交互与对易失性字段的写入相同。 特别地,任何线程在下一次调用
getTarget
时都可以看到更新的目标。- Specified by:
-
setTarget
在CallSite
- 参数
-
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:
-
dynamicInvoker
在CallSite
- 结果
- 总是调用此调用站点的当前目标的方法句柄
-
-