public class VolatileCallSite extends CallSite
VolatileCallSite
是一个CallSite
,其目标像一个volatile变量。
一个invokedynamic
指令链接到VolatileCallSite
看到更新其调用点目标立即,即使在另一个线程中发生的更新。
螺纹之间的这种紧密耦合可能会造成性能损失。
与MutableCallSite
不同,在易失性调用站点上没有syncAll operation ,因为对易失性变量的每次写入都与读取器线程隐含同步。
在其他方面, VolatileCallSite
可与MutableCallSite
。
MutableCallSite
Constructor and Description |
---|
VolatileCallSite(MethodHandle target)
创建一个具有对其目标的易失性绑定的调用站点。
|
VolatileCallSite(MethodType type)
创建一个具有对其目标的易失性绑定的调用站点。
|
Modifier and Type | Method and Description |
---|---|
MethodHandle |
dynamicInvoker()
生成等效于已经链接到此调用站点的invokedynamic指令的方法句柄。
|
MethodHandle |
getTarget()
返回调用点,其行为类似于目标的方法
volatile 基于场
VolatileCallSite 。
|
void |
setTarget(MethodHandle newTarget)
将此调用站点的目标方法更新为volatile变量。
|
public VolatileCallSite(MethodType type)
IllegalStateException
。
type
- 此呼叫站点将具有的方法类型
NullPointerException
- 如果提议的类型为空
public VolatileCallSite(MethodHandle target)
target
- 将作为呼叫站点初始目标的方法句柄
NullPointerException
- 如果提议的目标为null
public final MethodHandle getTarget()
volatile
基于场VolatileCallSite
。
getTarget
与存储器的getTarget
与从volatile
字段读取的相同。
特别地,当前线程需要从内存中发出目标的新鲜读取,并且不能看不到另一个线程对目标的最新更新。
getTarget
在类别
CallSite
setTarget(java.lang.invoke.MethodHandle)
public void setTarget(MethodHandle newTarget)
与存储器的交互与对易失性字段的写入相同。 特别地,任何线程在下次调用getTarget
时都可以看到更新的目标。
setTarget
在类别
CallSite
newTarget
- 新的目标
NullPointerException
- 如果提出的新目标为null
WrongMethodTypeException
- 如果所提出的新目标具有与先前目标不同的方法类型
getTarget()
public final MethodHandle dynamicInvoker()
此方法等同于以下代码:
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