- java.lang.Object
-
- java.lang.invoke.VarHandle
-
public abstract class VarHandleextends Object
VarHandle是对变量或参数定义的变量系列的动态强类型引用,包括静态字段,非静态字段,数组元素或堆外数据结构的组件。 在各种访问模式下都支持访问这些变量,包括普通读/写访问,易失性读/写访问以及比较和设置。VarHandles是不可变的,没有可见状态。 VarHandles不能被用户子类化。
VarHandle有:
- a
variable type
T,此VarHandle引用的每个变量的类型; 和 -
coordinate types
CT1, CT2, ..., CTn
的列表,共同定位此VarHandle引用的变量的坐标表达式的类型。
类
对象表示。 坐标类型列表可以为空。生成的工厂方法或
lookup
VarHandle实例记录了支持的变量类型和坐标类型列表。每种访问模式与一种访问模式方法相关联,该方法是以访问模式命名的signature polymorphic方法。 当在VarHandle实例上调用访问模式方法时,调用的初始参数是坐标表达式,它们精确地指示要访问变量的对象。 调用的尾随参数表示访问模式的重要值。 例如,各种比较和设置或比较和交换访问模式需要两个尾随参数用于变量的预期值和新值。
不会静态检查调用访问模式方法的arity和参数类型。 取而代之的是,每个接入模式的方法指定了一个
access mode type
,表示为的实例MethodType
,即作为一种方法签名针对其参数是动态检查。 访问模式类型根据VarHandle实例的坐标类型和访问模式的重要值类型给出形式参数类型。 访问模式类型也提供返回类型,通常根据VarHandle实例的变量类型。 在VarHandle实例上调用访问模式方法时,调用站点上的符号类型描述符,调用的参数的运行时类型以及返回值的运行时类型,必须是match访问模式中给出的类型类型。 如果匹配失败,将抛出运行时异常。 例如,访问模式方法compareAndSet(java.lang.Object...)
指定如果其接收器是具有坐标类型CT1, ..., CTn
和变量类型T
的VarHandle实例,则其访问模式类型是(CT1 c1, ..., CTn cn, T expectedValue, T newValue)boolean
。 假设VarHandle实例可以访问数组元素,并且其坐标类型为String[]
和int
而其变量类型为String
。 对于接入模式类型compareAndSet
这个VarHandle实例是(String[] c1, int c2, String expectedValue, String newValue)boolean
。 这样的VarHandle实例可以由array factory method
和访问数组元素产生,如下所示:String[] sa = ... VarHandle avh = MethodHandles.arrayElementVarHandle(String[].class); boolean r = avh.compareAndSet(sa, 10, "expected", "new");
访问模式控制原子性和一致性属性。 普通读取(
get
)和写入(set
)访问保证仅对于引用和最多32位的原始值是按位原子的,并且对于除执行线程之外的线程没有强加可观察的排序约束。 对于访问同一变量, 不透明操作是按位原子和相干有序的。 除了遵守不透明属性之外,在匹配释放模式写入及其先前的访问之后,还会对获取模式读取及其后续访问进行排序。 除了遵守Acquire和Release属性之外,所有Volatile操作都是相互完全排序的。访问模式分为以下几类:
- 读取访问模式,获取指定内存排序效果下的变量值。 该组对应属于该组的访问模式的方法的组成的方法
get
,getVolatile
,getAcquire
,getOpaque
。 - 写入访问模式,在指定的内存排序效果下设置变量的值。 该组对应属于该组的访问模式的方法的组成的方法
set
,setVolatile
,setRelease
,setOpaque
。 - 原子更新访问模式,例如,在指定的内存排序效果下,原子地比较和设置变量的值。 该组对应属于该组的访问模式的方法的组成的方法
compareAndSet
,weakCompareAndSetPlain
,weakCompareAndSet
,weakCompareAndSetAcquire
,weakCompareAndSetRelease
,compareAndExchangeAcquire
,compareAndExchange
,compareAndExchangeRelease
,getAndSet
,getAndSetAcquire
,getAndSetRelease
。 - 数字原子更新访问模式,例如,通过在指定的内存排序效果下添加变量的值,以原子方式获取和设置。 该组的属于该组的相应的访问模式的方法由方法
getAndAdd
,getAndAddAcquire
,getAndAddRelease
, - 按位原子更新访问模式,例如,在指定的内存排序效果下,以原子方式获取和按位OR变量的值。 该组对应属于该组的访问模式的方法的组成的方法
getAndBitwiseOr
,getAndBitwiseOrAcquire
,getAndBitwiseOrRelease
,getAndBitwiseAnd
,getAndBitwiseAndAcquire
,getAndBitwiseAndRelease
,getAndBitwiseXor
,getAndBitwiseXorAcquire
,getAndBitwiseXorRelease
。
生成的工厂方法或
lookup
VarHandle实例记录了所支持的访问模式集,其中还可能包括基于变量类型的文档限制以及变量是否为只读。 如果不支持访问模式,那么相应的访问模式方法将在调用时抛出UnsupportedOperationException
。 工厂方法应记录访问模式方法可能引发的任何其他未声明的异常。 所有VarHandle实例都支持get
访问模式,相应的方法永远不会抛出UnsupportedOperationException
。 如果VarHandle引用只读变量(例如final
字段),则不支持写入,原子更新,数字原子更新和按位原子更新访问模式,并且相应的方法抛出UnsupportedOperationException
。 读/写访问模式(如果支持),get
和set
,为引用类型和所有基元类型提供原子访问。 除非在工厂方法的文档中另有说明,否则访问模式get
和set
(如果支持)为参考类型和所有基元类型提供原子访问,但32位平台上的long
和double
除外。访问模式将覆盖变量声明站点上指定的任何内存排序效果。 例如,使用
get
访问模式访问字段的get
将访问由其访问模式指定的字段,即使该字段声明为volatile
。 当执行混合访问时,应特别小心,因为Java内存模型可能会产生令人惊讶的结果。除了支持在各种访问模式下访问变量之外,还提供了一组静态方法,称为内存栅栏方法,用于细粒度控制内存排序。 Java语言规范允许其他线程观察操作,就像它们以不同于程序源代码中明显的顺序执行,受到例如使用锁,
volatile
字段或VarHandles的限制。 静态方法,fullFence
,acquireFence
,releaseFence
,loadLoadFence
和storeStoreFence
,也可以用来施加约束。 与某些访问模式的情况一样,它们的规范是根据缺乏“重新排序”来表达的 - 如果不存在围栏,则可能出现可观察到的排序效应。 访问模式方法和存储器范围方法的规范的更精确的措辞可以伴随Java语言规范的未来更新。编译访问模式方法的调用
命名访问模式方法的Java方法调用表达式可以从Java源代码调用VarHandle。 从源代码的角度来看,这些方法可以接受任何参数,并且它们的多态结果(如果表达的话)可以转换为任何返回类型。 正式地,这是通过给出访问模式方法变量arityObject
参数和Object
返回类型(如果返回类型是多态的)来实现的,但是它们具有称为签名多态的附加质量,其将这种调用自由直接连接到JVM执行堆栈。与通常的虚方法一样,对访问模式方法的源级调用将编译为
invokevirtual
指令。 更不寻常的是,编译器必须记录实际的参数类型,并且可能不会对参数执行方法调用转换。 相反,它必须根据自己未转换的类型生成将它们压入堆栈的指令。 VarHandle对象本身将在参数之前被压入堆栈。 然后,编译器生成invokevirtual
指令,该指令使用描述参数和返回类型的符号类型描述符调用访问模式方法。要发出完整的符号类型描述符,编译器还必须确定返回类型(如果是多态的)。 这是基于对方法调用表达式的
Object
(如果有),或者如果调用是表达式void
如果调用是语句,void
。 演员表可以是原始类型(但不是void
)。作为极端情况,未发布的
null
参数被赋予符号类型描述符java.lang.Void
。 类型Void
的模糊性是无害的,因为除了null引用之外没有类型Void
的引用。Performing invocation of access mode methods
第一次执行invokevirtual
指令时,它通过符号解析指令中的名称并验证方法调用是静态合法的来链接。 这也适用于访问模式方法的调用。 在这种情况下,将检查编译器发出的符号类型描述符的语法是否正确,并解析它包含的名称。 因此,只要符号类型描述符在语法上格式良好并且存在类型,则调用访问模式方法的invokevirtual
指令将始终链接。当
invokevirtual
被连接之后执行,则接收VarHandle的接入模式类型首先被JVM检查,以确保它的符号类型描述符相匹配。 如果类型匹配失败,则意味着调用者正在调用的访问模式方法不会出现在被调用的单个VarHandle上。调用访问模式方法的行为就像调用
MethodHandle.invoke(java.lang.Object...)
一样 ,其中接收方法句柄接受VarHandle实例作为前导参数。 更具体地说,以下,其中{access-mode}
对应于访问模式方法名称:VarHandle vh = .. R r = (R) vh.{access-mode}(p1, p2, ..., pN);
VarHandle vh = .. VarHandle.AccessMode am = VarHandle.AccessMode.valueFromMethodName("{access-mode}"); MethodHandle mh = MethodHandles.varHandleExactInvoker( am, vh.accessModeType(am)); R r = (R) mh.invoke(vh, p1, p2, ..., pN)
Throwable
)。 这相当于:MethodHandle mh = MethodHandles.lookup().findVirtual( VarHandle.class, "{access-mode}", MethodType.methodType(R, p1, p2, ..., pN)); R r = (R) mh.invokeExact(vh, p1, p2, ..., pN)
MethodHandle.invokeExact(java.lang.Object...)
,因为在调用目标之前,句柄将根据需要应用引用强制转换以及box,unbox或widen原始值,就像asType
一样 (另请参阅MethodHandles.varHandleInvoker(java.lang.invoke.VarHandle.AccessMode, java.lang.invoke.MethodType)
) 。 更简洁地说,这种行为相当于:VarHandle vh = .. VarHandle.AccessMode am = VarHandle.AccessMode.valueFromMethodName("{access-mode}"); MethodHandle mh = vh.toMethodHandle(am); R r = (R) mh.invoke(p1, p2, ..., pN)
调用检查
在典型的程序中,VarHandle访问模式类型匹配通常会成功。 但如果匹配失败,JVM将抛出WrongMethodTypeException
。因此,接入模式类型不匹配可能显示为在一个静态类型节目联动误差最多可以显示作为动态
WrongMethodTypeException
在使用VarHandles的程序。由于访问模式类型包含“实时”
类
对象,因此方法类型匹配会同时考虑类型名称和类加载器。 因此,即使VarHandleVH
在一个类加载器L1
创建并在另一个L2
,VarHandle访问模式方法调用也是类型安全的,因为调用者的符号类型描述符(在L2
中已解析)与原始被调用方法的符号相匹配类型描述符,如L1
。 决议L1
时发生VH
创建和访问模式类型分配,而在分辨率L2
当发生invokevirtual
指令链接。除了类型描述符检查之外,VarHandles访问它的变量的能力是不受限制的。 如果一个VarHandle由一个可以访问该变量的类在非公共变量上形成,那么任何接收对它的引用的调用者都可以在任何地方使用生成的VarHandle。
与Core Reflection API不同,每次调用反射方法时都会检查访问权限,执行VarHandle访问检查when the VarHandle is created 。 因此,VarHandles与非公共变量或非公共类中的变量一般应保密。 除非从不受信任的代码中使用它们是无害的,否则不应将它们传递给不受信任的代码。
VarHandle创作
Java代码可以创建一个VarHandle,直接访问该代码可访问的任何字段。 这是通过一个名为MethodHandles.Lookup
的基于功能的反射API 完成的 。 例如,可以从Lookup.findVarHandle
获得非静态字段的VarHandle 。 Core Reflection API对象还有一种转换方法,Lookup.unreflectVarHandle
。对受保护字段成员的访问仅限于访问类或其子类之一的接收者,并且访问类必须又是受保护成员的定义类的子类(或包兄弟)。 如果VarHandle引用当前包之外的声明类的受保护的非静态字段,则receiver参数将缩小为访问类的类型。
VarHandles与Core Reflection API之间的互操作
使用Lookup
API中的工厂方法,可以将Core Reflection API对象表示的任何字段转换为行为等效的VarHandle。 例如,可以使用Lookup.unreflectVarHandle
将反射字段
转换为VarHandle 。 生成的VarHandles通常提供对底层字段的更直接和有效的访问。作为一种特殊情况,当Core Reflection API用于查看此类中的签名多态访问模式方法时,它们显示为普通的非多态方法。 如
Class.getDeclaredMethod
所示 ,它们的反射外观不受其在此API中的特殊状态的影响。 例如,Method.getModifiers
将准确报告任何类似声明的方法所需的那些修饰符位,包括native
和varargs
位。与任何反射方法一样,这些方法(反映时)可以通过
java.lang.reflect.Method.invoke
,JNI或间接通过Lookup.unreflect
直接调用。 但是,这种反射调用不会导致访问模式方法调用。 这样的调用,如果传递了所需的参数(类型为Object[]
的单个参数),将忽略该参数并将抛出UnsupportedOperationException
。由于
invokevirtual
指令可以在任何符号类型描述符下原生调用VarHandle访问模式方法,因此该反射视图与通过字节码的这些方法的正常表示冲突。 因此,当Class.getDeclaredMethod
反思地查看时,这些本机方法可能仅被视为占位符。要获取特定访问模式类型的调用方法,请使用
MethodHandles.varHandleExactInvoker(java.lang.invoke.VarHandle.AccessMode, java.lang.invoke.MethodType)
或MethodHandles.varHandleInvoker(java.lang.invoke.VarHandle.AccessMode, java.lang.invoke.MethodType)
。Lookup.findVirtual
API还能够返回方法句柄,以便为任何指定的访问模式类型调用访问模式方法,并且行为与MethodHandles.varHandleInvoker(java.lang.invoke.VarHandle.AccessMode, java.lang.invoke.MethodType)
相同 。VarHandles与Java泛型之间的互操作
可以为变量(例如字段)获取VarHandle,该变量使用Java泛型类型声明。 与Core Reflection API一样,VarHandle的变量类型将从源级别类型的擦除构造。 调用VarHandle访问模式方法时,其参数类型或返回值强制转换类型可以是泛型类型或类型实例。 如果发生这种情况,编译器将在构造invokevirtual
指令的符号类型描述符时通过其擦除替换这些类型。- 从以下版本开始:
- 9
- 另请参见:
-
MethodHandle
,MethodHandles
,MethodType
- a
-
-
嵌套类汇总
嵌套类 变量和类型 类 描述 static class
VarHandle.AccessMode
一组访问模式,用于指定如何访问由VarHandle引用的变量。
-
方法摘要
所有方法 静态方法 实例方法 具体的方法 变量和类型 方法 描述 MethodType
accessModeType(VarHandle.AccessMode accessMode)
获得此VarHandle的访问模式类型和给定的访问模式。static void
acquireFence()
确保栅栏前的载荷不会在栅栏后的载荷和存储中重新排序。Object
compareAndExchange(Object... args)
原子性地将变量的值设置为newValue
,其内存语义为setVolatile(java.lang.Object...)
,如果变量的当前值(称为 见证值==
expectedValue
,则使用expectedValue
的内存语义进行 访问 。Object
compareAndExchangeAcquire(Object... args)
以原子方式设置的变量的值newValue
用的存储器语义set(java.lang.Object...)
如果该变量的当前值,被称为 证人值 ,==
的expectedValue
,与的存储器访问语义getAcquire(java.lang.Object...)
。Object
compareAndExchangeRelease(Object... args)
以原子方式设置的变量的值newValue
用的存储器语义setRelease(java.lang.Object...)
如果该变量的当前值,被称为 证人值 ,==
的expectedValue
,与的存储器访问语义get(java.lang.Object...)
。boolean
compareAndSet(Object... args)
以原子方式设置的变量的值newValue
用的存储器语义setVolatile(java.lang.Object...)
如果该变量的当前值,被称为 证人值 ,==
的expectedValue
,与的存储器访问语义getVolatile(java.lang.Object...)
。List<类<?>>
coordinateTypes()
返回此VarHandle的坐标类型。static void
fullFence()
确保围栏之前的装载和存储不会在围栏之后与装载和存储重新排序。Object
get(Object... args)
返回变量的值,读取的内存语义就像变量声明为非volatile
。Object
getAcquire(Object... args)
返回变量的值,并确保在此访问之前不会重新排序后续加载和存储。Object
getAndAdd(Object... args)
原子地将value
添加到变量的当前值,其内存语义为setVolatile(java.lang.Object...)
,并返回变量的先前值,如内存语义getVolatile(java.lang.Object...)
所示 。Object
getAndAddAcquire(Object... args)
原子地将value
添加到变量的当前值,其内存语义为set(java.lang.Object...)
,并返回变量的先前值,如使用getAcquire(java.lang.Object...)
的内存语义访问的 那样 。Object
getAndAddRelease(Object... args)
原子地将value
添加到变量的当前值,其内存语义为setRelease(java.lang.Object...)
,并返回变量的先前值,如使用get(java.lang.Object...)
的内存语义访问的 那样 。Object
getAndBitwiseAnd(Object... args)
原子地将变量的值设置为变量的当前值与mask
之间的按位AND结果,其内存语义为setVolatile(java.lang.Object...)
,并返回变量的先前值,如内存语义getVolatile(java.lang.Object...)
所示 。Object
getAndBitwiseAndAcquire(Object... args)
原子地将变量的值设置为变量的当前值与mask
之间的按位AND结果,其内存语义为set(java.lang.Object...)
,并返回变量的先前值,如内存语义getAcquire(java.lang.Object...)
所示 。Object
getAndBitwiseAndRelease(Object... args)
以原子方式将变量的值设置为变量的当前值与mask
之间的按位AND结果,内存语义为setRelease(java.lang.Object...)
,并返回变量的先前值,如内存语义get(java.lang.Object...)
所示 。Object
getAndBitwiseOr(Object... args)
原子地将变量的值设置为变量的当前值与mask
之间的按位OR结果,其内存语义为setVolatile(java.lang.Object...)
,并返回变量的先前值,如内存语义getVolatile(java.lang.Object...)
所示 。Object
getAndBitwiseOrAcquire(Object... args)
原子地将变量的值设置为变量的当前值与mask
之间的按位OR结果,其内存语义为set(java.lang.Object...)
,并返回变量的先前值,如内存语义getAcquire(java.lang.Object...)
所示 。Object
getAndBitwiseOrRelease(Object... args)
原子地将变量的值设置为变量的当前值与mask
之间的按位OR结果,其内存语义为setRelease(java.lang.Object...)
,并返回变量的先前值,如内存语义get(java.lang.Object...)
所示 。Object
getAndBitwiseXor(Object... args)
原子地将变量的值设置为变量的当前值与mask
之间的按位异或结果,其内存语义为setVolatile(java.lang.Object...)
,并返回变量的先前值,如内存语义getVolatile(java.lang.Object...)
所示 。Object
getAndBitwiseXorAcquire(Object... args)
原子地将变量的值设置为变量的当前值与mask
之间的按位异或结果,其内存语义为set(java.lang.Object...)
,并返回变量的先前值,如内存语义getAcquire(java.lang.Object...)
所示 。Object
getAndBitwiseXorRelease(Object... args)
原子地将变量的值设置为变量的当前值与mask
之间的按位异或结果,其内存语义为setRelease(java.lang.Object...)
,并返回变量的先前值,如内存语义get(java.lang.Object...)
所示 。Object
getAndSet(Object... args)
原子方式将变量的值设置为newValue
,内存语义为setVolatile(java.lang.Object...)
,并返回变量的先前值,如内存语义getVolatile(java.lang.Object...)
所示 。Object
getAndSetAcquire(Object... args)
原子方式将变量的值设置为newValue
,内存语义为set(java.lang.Object...)
,并返回变量的先前值,如内存语义getAcquire(java.lang.Object...)
所示 。Object
getAndSetRelease(Object... args)
以原子方式将变量的值设置为newValue
,内存语义为setRelease(java.lang.Object...)
,并返回变量的先前值,如内存语义get(java.lang.Object...)
所示 。Object
getOpaque(Object... args)
返回以程序顺序访问的变量的值,但不保证相对于其他线程的内存排序效果。Object
getVolatile(Object... args)
返回变量的值,读取的内存语义就像声明变量volatile
。boolean
isAccessModeSupported(VarHandle.AccessMode accessMode)
如果支持给定的访问模式,则返回true
,否则false
。static void
loadLoadFence()
确保栅栏前的载荷不会与栅栏后的载荷重新排序。static void
releaseFence()
确保栅栏前的装载和存储不会在栅栏后与存储重新排序。void
set(Object... args)
将变量的值设置为newValue
,其内存语义设置为将变量声明为非volatile
final
。void
setOpaque(Object... args)
按程序顺序将变量的值设置为newValue
,但不保证相对于其他线程的内存排序效果。void
setRelease(Object... args)
将变量的值设置为newValue
,并确保在此访问后不重新排序先前的加载和存储。void
setVolatile(Object... args)
将变量的值设置为newValue
,设置的内存语义就像声明变量volatile
。static void
storeStoreFence()
确保栅栏前的商店不会在栅栏后与商店重新订购。MethodHandle
toMethodHandle(VarHandle.AccessMode accessMode)
获取绑定到此VarHandle的方法句柄和给定的访问模式。类<?>
varType()
返回此VarHandle引用的变量的变量类型。boolean
weakCompareAndSet(Object... args)
可能原子将变量到值newValue
用的存储器语义setVolatile(java.lang.Object...)
如果该变量的当前值,被称为 证人值 ,==
的expectedValue
,与的存储器访问语义getVolatile(java.lang.Object...)
。boolean
weakCompareAndSetAcquire(Object... args)
可能原子将变量到值newValue
用的语义set(java.lang.Object...)
如果变量的当前值,被称为 证人值 ,==
的expectedValue
,与的存储器访问语义getAcquire(java.lang.Object...)
。boolean
weakCompareAndSetPlain(Object... args)
可能原子将变量到值newValue
用的语义set(java.lang.Object...)
如果变量的当前值,被称为 证人值 ,==
的expectedValue
,与的存储器访问语义get(java.lang.Object...)
。boolean
weakCompareAndSetRelease(Object... args)
可能原子将变量到值newValue
用的语义setRelease(java.lang.Object...)
如果变量的当前值,被称为 证人值 ,==
的expectedValue
,与的存储器访问语义get(java.lang.Object...)
。
-
-
-
方法详细信息
-
get
public final Object get(Object... args)
返回变量的值,读取的内存语义就像变量被声明为非volatile
。 通常称为普通读取访问。方法签名的格式为
(CT1 ct1, ..., CTn ctn)T
。调用站点
get
处的符号类型描述符必须与在此VarHandle上调用accessModeType(VarHandle.AccessMode.GET)
的结果的访问模式类型匹配。所有VarHandle实例都支持此访问模式,并且从不抛出
UnsupportedOperationException
。- 参数
-
args
- 形式(CT1 ct1, ..., CTn)
的签名多态参数列表,使用varargs静态表示。 - 结果
- 签名 - 多态结果,即变量的值,使用
Object
静态表示。 - 异常
-
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用ClassCastException
失败。
-
set
public final void set(Object... args)
将变量的值设置为newValue
,设置的内存语义就像变量被声明为非volatile
和非final
。 通常称为普通写访问。方法签名的格式为
(CT1 ct1, ..., CTn ctn, T newValue)void
调用站点
set
处的符号类型描述符必须与在此VarHandle上调用accessModeType(VarHandle.AccessMode.SET)
的结果的访问模式类型匹配。- 参数
-
args
- 形式(CT1 ct1, ..., CTn ctn, T newValue)
的签名多态参数列表,使用varargs静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用ClassCastException
失败。
-
getVolatile
public final Object getVolatile(Object... args)
返回变量的值,读取的内存语义就像声明变量volatile
。方法签名的格式为
(CT1 ct1, ..., CTn ctn)T
。调用站点
getVolatile
处的符号类型描述符必须与在此VarHandle上调用accessModeType(VarHandle.AccessMode.GET_VOLATILE)
的结果的访问模式类型匹配。- 参数
-
args
- 形式为(CT1 ct1, ..., CTn ctn)
的签名多态参数列表,使用varargs静态表示。 - 结果
- 签名 - 多态结果,即变量的值,使用
Object
静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用ClassCastException
失败。
-
setVolatile
public final void setVolatile(Object... args)
将变量的值设置为newValue
,设置的内存语义就像声明变量volatile
。方法签名的格式为
(CT1 ct1, ..., CTn ctn, T newValue)void
。调用站点
setVolatile
处的符号类型描述符必须与在此VarHandle上调用accessModeType(VarHandle.AccessMode.SET_VOLATILE)
的结果的访问模式类型匹配。- API Note:
- 忽略C和C ++的许多语义差异,此方法具有与
memory_order_seq_cst
兼容的内存排序效果。 - 参数
-
args
- 形式(CT1 ct1, ..., CTn ctn, T newValue)
的签名多态参数列表,使用varargs静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用ClassCastException
失败。
-
getOpaque
public final Object getOpaque(Object... args)
返回以程序顺序访问的变量的值,但不保证相对于其他线程的内存排序效果。方法签名的格式为
(CT1 ct1, ..., CTn ctn)T
。调用站点
getOpaque
处的符号类型描述符必须与访问模式类型匹配,该访问模式类型是在此VarHandle上调用accessModeType(VarHandle.AccessMode.GET_OPAQUE)
的结果。- 参数
-
args
- 形式(CT1 ct1, ..., CTn ctn)
的签名多态参数列表,使用varargs静态表示。 - 结果
- 签名 - 多态结果,即变量的值,使用
Object
静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用ClassCastException
失败。
-
setOpaque
public final void setOpaque(Object... args)
按程序顺序将变量的值设置为newValue
,但不保证相对于其他线程的内存排序效果。方法签名的格式为
(CT1 ct1, ..., CTn ctn, T newValue)void
。调用站点
setOpaque
处的符号类型描述符必须与访问模式类型匹配,该访问模式类型是在此VarHandle上调用accessModeType(VarHandle.AccessMode.SET_OPAQUE)
的结果。- 参数
-
args
- 形式为(CT1 ct1, ..., CTn ctn, T newValue)
的签名多态参数列表,使用varargs静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用ClassCastException
失败。
-
getAcquire
public final Object getAcquire(Object... args)
返回变量的值,并确保在此访问之前不会重新排序后续加载和存储。方法签名的格式为
(CT1 ct1, ..., CTn ctn)T
。调用站点
getAcquire
处的符号类型描述符必须与访问模式类型匹配,该访问模式类型是在此VarHandle上调用accessModeType(VarHandle.AccessMode.GET_ACQUIRE)
的结果。- API Note:
- 忽略C和C ++的许多语义差异,此方法具有与
memory_order_acquire
排序兼容的内存排序效果。 - 参数
-
args
-形式的签名的多态参数列表(CT1 ct1, ..., CTn ctn)
,使用可变参数静态表示。 - 结果
- 签名 - 多态结果,即变量的值,使用
Object
静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用ClassCastException
失败。
-
setRelease
public final void setRelease(Object... args)
将变量的值设置为newValue
,并确保在此访问后不会重新排序先前的加载和存储。方法签名的格式为
(CT1 ct1, ..., CTn ctn, T newValue)void
。调用站点
setRelease
处的符号类型描述符必须与在此VarHandle上调用accessModeType(VarHandle.AccessMode.SET_RELEASE)
的结果的访问模式类型匹配。- API Note:
- 忽略C和C ++的许多语义差异,此方法具有与
memory_order_release
排序兼容的内存排序效果。 - 参数
-
args
- 形式为(CT1 ct1, ..., CTn ctn, T newValue)
的签名多态参数列表,使用varargs静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用ClassCastException
失败。
-
compareAndSet
public final boolean compareAndSet(Object... args)
以原子方式设置的变量的值newValue
用的存储器语义setVolatile(java.lang.Object...)
如果该变量的当前值,被称为证人值 ,==
的expectedValue
,与的存储器访问语义getVolatile(java.lang.Object...)
。方法签名的格式为
(CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)boolean
。呼叫站点
compareAndSet
处的符号类型描述符必须与在此VarHandle上调用accessModeType(VarHandle.AccessMode.COMPARE_AND_SET)
的结果的访问模式类型匹配。- 参数
-
args
- 形式为(CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)
的签名多态参数列表,使用varargs静态表示。 - 结果
-
true
如果成功,否则false
如果见证值与expectedValue
。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用ClassCastException
失败。 - 另请参见:
-
setVolatile(Object...)
,getVolatile(Object...)
-
compareAndExchange
public final Object compareAndExchange(Object... args)
以原子方式设置的变量的值newValue
用的存储器语义setVolatile(java.lang.Object...)
如果该变量的当前值,被称为证人值 ,==
的expectedValue
,与的存储器访问语义getVolatile(java.lang.Object...)
。方法签名的格式为
(CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)T
。调用站点
compareAndExchange
处的符号类型描述符必须与在此VarHandle上调用accessModeType(VarHandle.AccessMode.COMPARE_AND_EXCHANGE)
的结果的访问模式类型匹配。- 参数
-
args
- 形式为(CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)
的签名多态参数列表,使用varargs静态表示。 - 结果
- 签名多态结果即见证值,如果成功则与
expectedValue
相同,使用Object
静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不兼容。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符兼容,但引用ClassCastException
失败。 - 另请参见:
-
setVolatile(Object...)
,getVolatile(Object...)
-
compareAndExchangeAcquire
public final Object compareAndExchangeAcquire(Object... args)
以原子方式设置的变量的值newValue
用的存储器语义set(java.lang.Object...)
如果该变量的当前值,被称为证人值 ,==
的expectedValue
,与的存储器访问语义getAcquire(java.lang.Object...)
。方法签名的格式为
(CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)T
。呼叫站点
compareAndExchangeAcquire
处的符号类型描述符必须与在此VarHandle上调用accessModeType(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_ACQUIRE)
的结果的访问模式类型匹配。- 参数
-
args
- 形式(CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)
的签名多态参数列表,使用varargs静态表示。 - 结果
- 签名多态结果即见证值,如果成功则与
expectedValue
相同,使用Object
静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用ClassCastException
失败。 - 另请参见:
-
set(Object...)
,getAcquire(Object...)
-
compareAndExchangeRelease
public final Object compareAndExchangeRelease(Object... args)
以原子方式设置的变量的值newValue
用的存储器语义setRelease(java.lang.Object...)
如果该变量的当前值,被称为证人值 ,==
的expectedValue
,与的存储器访问语义get(java.lang.Object...)
。方法签名的格式为
(CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)T
。调用站点
compareAndExchangeRelease
处的符号类型描述符必须与在此VarHandle上调用accessModeType(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE)
的结果的访问模式类型匹配。- 参数
-
args
- 形式(CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)
的签名多态参数列表,使用varargs静态表示。 - 结果
- 作为见证值的签名多态结果,如果成功则与
expectedValue
相同,使用Object
静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用转换失败。 - 另请参见:
-
setRelease(Object...)
,get(Object...)
-
weakCompareAndSetPlain
public final boolean weakCompareAndSetPlain(Object... args)
可能原子将变量到值newValue
用的语义set(java.lang.Object...)
如果变量的当前值,被称为证人值 ,==
的expectedValue
,与的存储器访问语义get(java.lang.Object...)
。即使见证值与预期值匹配,此操作也可能是虚假失败(通常是由于内存争用)。
方法签名的格式为
(CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)boolean
。调用站点
weakCompareAndSetPlain
处的符号类型描述符必须与在此VarHandle上调用accessModeType(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_PLAIN)
的结果的访问模式类型匹配。- 参数
-
args
- 形式为(CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)
的签名多态参数列表,使用varargs静态表示。 - 结果
-
true
如果成功,否则false
如果见证值与expectedValue
或者此操作虚假失败。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用ClassCastException
失败。 - 另请参见:
-
set(Object...)
,get(Object...)
-
weakCompareAndSet
public final boolean weakCompareAndSet(Object... args)
可能原子将变量到值newValue
用的存储器语义setVolatile(java.lang.Object...)
如果该变量的当前值,被称为证人值 ,==
的expectedValue
,与的存储器访问语义getVolatile(java.lang.Object...)
。即使见证值与预期值匹配,此操作也可能是虚假失败(通常是由于内存争用)。
方法签名的格式为
(CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)boolean
。调用站点
weakCompareAndSet
处的符号类型描述符必须与在此VarHandle上调用accessModeType(VarHandle.AccessMode.WEAK_COMPARE_AND_SET)
的结果的访问模式类型匹配。- 参数
-
args
- 形式为(CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)
的签名多态参数列表,使用varargs静态表示。 - 结果
-
true
如果成功,否则false
如果见证值与expectedValue
或者此操作虚假失败。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用ClassCastException
失败。 - 另请参见:
-
setVolatile(Object...)
,getVolatile(Object...)
-
weakCompareAndSetAcquire
public final boolean weakCompareAndSetAcquire(Object... args)
可能原子将变量到值newValue
用的语义set(java.lang.Object...)
如果变量的当前值,被称为证人值 ,==
的expectedValue
,与的存储器访问语义getAcquire(java.lang.Object...)
。即使见证值与预期值匹配,此操作也可能是虚假失败(通常是由于内存争用)。
方法签名的格式为
(CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)boolean
。调用站点
weakCompareAndSetAcquire
处的符号类型描述符必须与访问模式类型匹配,该访问模式类型是在此VarHandle上调用accessModeType(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE)
的结果。- 参数
-
args
- 形式(CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)
的签名多态参数列表,使用varargs静态表示。 - 结果
-
true
如果成功,否则false
如果见证值与expectedValue
或者此操作虚假失败。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用ClassCastException
失败。 - 另请参见:
-
set(Object...)
,getAcquire(Object...)
-
weakCompareAndSetRelease
public final boolean weakCompareAndSetRelease(Object... args)
可能原子将变量到值newValue
用的语义setRelease(java.lang.Object...)
如果变量的当前值,被称为证人值 ,==
的expectedValue
,与的存储器访问语义get(java.lang.Object...)
。即使见证值与预期值匹配,此操作也可能是虚假失败(通常是由于内存争用)。
方法签名的格式为
(CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)boolean
。呼叫站点
weakCompareAndSetRelease
处的符号类型描述符必须与在此VarHandle上调用accessModeType(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)
的结果的访问模式类型匹配。- 参数
-
args
- 形式(CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)
的签名多态参数列表,使用varargs静态表示。 - 结果
-
true
如果成功,否则false
如果见证值与expectedValue
或者此操作虚假失败。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用ClassCastException
失败。 - 另请参见:
-
setRelease(Object...)
,get(Object...)
-
getAndSet
public final Object getAndSet(Object... args)
以原子方式将变量的值设置为newValue
,内存语义为setVolatile(java.lang.Object...)
,并返回变量的先前值,如内存语义getVolatile(java.lang.Object...)
所示 。方法签名的格式为
(CT1 ct1, ..., CTn ctn, T newValue)T
。呼叫站点
getAndSet
处的符号类型描述符必须与在此VarHandle上调用accessModeType(VarHandle.AccessMode.GET_AND_SET)
的结果的访问模式类型匹配。- 参数
-
args
- 形式为(CT1 ct1, ..., CTn ctn, T newValue)
的签名多态参数列表,使用varargs静态表示。 - 结果
- 签名 - 多态结果,即变量的先前值,使用
Object
静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用转换失败。 - 另请参见:
-
setVolatile(Object...)
,getVolatile(Object...)
-
getAndSetAcquire
public final Object getAndSetAcquire(Object... args)
以原子方式将变量的值设置为newValue
,内存语义为set(java.lang.Object...)
,并返回变量的先前值,如内存语义getAcquire(java.lang.Object...)
所示 。方法签名的格式为
(CT1 ct1, ..., CTn ctn, T newValue)T
。呼叫站点
getAndSetAcquire
处的符号类型描述符必须与在此VarHandle上调用accessModeType(VarHandle.AccessMode.GET_AND_SET_ACQUIRE)
的结果的访问模式类型匹配。- 参数
-
args
- 形式(CT1 ct1, ..., CTn ctn, T newValue)
的签名多态参数列表,使用varargs静态表示。 - 结果
- 签名 - 多态结果,即变量的先前值,使用
Object
静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用ClassCastException
失败。 - 另请参见:
-
setVolatile(Object...)
,getVolatile(Object...)
-
getAndSetRelease
public final Object getAndSetRelease(Object... args)
以原子方式将变量的值设置为newValue
,内存语义为setRelease(java.lang.Object...)
,并返回变量的先前值,如内存语义get(java.lang.Object...)
所示 。方法签名的格式为
(CT1 ct1, ..., CTn ctn, T newValue)T
。调用站点
getAndSetRelease
处的符号类型描述符必须与在此VarHandle上调用accessModeType(VarHandle.AccessMode.GET_AND_SET_RELEASE)
的访问模式类型匹配。- 参数
-
args
- 形式(CT1 ct1, ..., CTn ctn, T newValue)
的签名多态参数列表,使用varargs静态表示。 - 结果
- 签名 - 多态结果,即变量的先前值,使用
Object
静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用ClassCastException
失败。 - 另请参见:
-
setVolatile(Object...)
,getVolatile(Object...)
-
getAndAdd
public final Object getAndAdd(Object... args)
原子地将value
添加到变量的当前值,其内存语义为setVolatile(java.lang.Object...)
,并返回变量的先前值,如内存语义getVolatile(java.lang.Object...)
所示 。方法签名的格式为
(CT1 ct1, ..., CTn ctn, T value)T
。呼叫站点
getAndAdd
处的符号类型描述符必须与在此VarHandle上调用accessModeType(VarHandle.AccessMode.GET_AND_ADD)
的结果的访问模式类型匹配。- 参数
-
args
- 形式为(CT1 ct1, ..., CTn ctn, T value)
的签名多态参数列表,使用varargs静态表示。 - 结果
- 签名 - 多态结果,即变量的先前值,使用
Object
静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用ClassCastException
失败。 - 另请参见:
-
setVolatile(Object...)
,getVolatile(Object...)
-
getAndAddAcquire
public final Object getAndAddAcquire(Object... args)
原子地将value
添加到变量的当前值,其内存语义为set(java.lang.Object...)
,并返回变量的先前值,如使用getAcquire(java.lang.Object...)
的内存语义访问的那样 。方法签名的格式为
(CT1 ct1, ..., CTn ctn, T value)T
。呼叫站点
getAndAddAcquire
处的符号类型描述符必须与在此VarHandle上调用accessModeType(VarHandle.AccessMode.GET_AND_ADD_ACQUIRE)
的结果的访问模式类型匹配。- 参数
-
args
- 形式(CT1 ct1, ..., CTn ctn, T value)
的签名多态参数列表,使用varargs静态表示。 - 结果
- 签名 - 多态结果,即变量的先前值,使用
Object
静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用ClassCastException
失败。 - 另请参见:
-
setVolatile(Object...)
,getVolatile(Object...)
-
getAndAddRelease
public final Object getAndAddRelease(Object... args)
原子地将value
添加到变量的当前值,其内存语义为setRelease(java.lang.Object...)
,并返回变量的先前值,如内存语义get(java.lang.Object...)
所示 。方法签名的格式为
(CT1 ct1, ..., CTn ctn, T value)T
。呼叫站点
getAndAddRelease
处的符号类型描述符必须与在此VarHandle上调用accessModeType(VarHandle.AccessMode.GET_AND_ADD_RELEASE)
的结果的访问模式类型匹配。- 参数
-
args
- 形式(CT1 ct1, ..., CTn ctn, T value)
的签名多态参数列表,使用varargs静态表示。 - 结果
- 签名 - 多态结果,即变量的先前值,使用
Object
静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用ClassCastException
失败。 - 另请参见:
-
setVolatile(Object...)
,getVolatile(Object...)
-
getAndBitwiseOr
public final Object getAndBitwiseOr(Object... args)
原子地将变量的值设置为变量的当前值与mask
之间的按位OR结果,内存语义为setVolatile(java.lang.Object...)
,并返回变量的先前值,如内存语义getVolatile(java.lang.Object...)
所示 。如果变量类型是非整数
boolean
类型,则执行逻辑OR而不是按位OR。方法签名的格式为
(CT1 ct1, ..., CTn ctn, T mask)T
。呼叫站点
getAndBitwiseOr
处的符号类型描述符必须与在此VarHandle上调用accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_OR)
的结果的访问模式类型匹配。- 参数
-
args
- 形式为(CT1 ct1, ..., CTn ctn, T mask)
的签名多态参数列表,使用varargs静态表示。 - 结果
- 签名 - 多态结果,即变量的先前值,使用
Object
静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用ClassCastException
失败。 - 另请参见:
-
setVolatile(Object...)
,getVolatile(Object...)
-
getAndBitwiseOrAcquire
public final Object getAndBitwiseOrAcquire(Object... args)
原子地将变量的值设置为变量的当前值与mask
之间的按位OR结果,其内存语义为set(java.lang.Object...)
,并返回变量的先前值,如内存语义getAcquire(java.lang.Object...)
所示 。如果变量类型是非整数
boolean
类型,则执行逻辑OR而不是按位OR。方法签名的格式为
(CT1 ct1, ..., CTn ctn, T mask)T
。呼叫站点
getAndBitwiseOrAcquire
处的符号类型描述符必须与在此VarHandle上调用accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_OR_ACQUIRE)
的结果的访问模式类型匹配。- 参数
-
args
- 形式(CT1 ct1, ..., CTn ctn, T mask)
的签名多态参数列表,使用varargs静态表示。 - 结果
- 签名 - 多态结果,即变量的先前值,使用
Object
静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用ClassCastException
失败。 - 另请参见:
-
set(Object...)
,getAcquire(Object...)
-
getAndBitwiseOrRelease
public final Object getAndBitwiseOrRelease(Object... args)
原子地将变量的值设置为变量的当前值与mask
之间的按位OR结果,其内存语义为setRelease(java.lang.Object...)
,并返回变量的先前值,如内存语义get(java.lang.Object...)
所示 。如果变量类型是非整数
boolean
类型,则执行逻辑OR而不是按位OR。方法签名的格式为
(CT1 ct1, ..., CTn ctn, T mask)T
。调用站点
getAndBitwiseOrRelease
处的符号类型描述符必须与在此VarHandle上调用accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_OR_RELEASE)
的结果的访问模式类型匹配。- 参数
-
args
- 形式(CT1 ct1, ..., CTn ctn, T mask)
的签名多态参数列表,使用varargs静态表示。 - 结果
- 签名 - 多态结果,即变量的先前值,使用
Object
静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用ClassCastException
失败。 - 另请参见:
-
setRelease(Object...)
,get(Object...)
-
getAndBitwiseAnd
public final Object getAndBitwiseAnd(Object... args)
原子地将变量的值设置为变量的当前值与mask
之间的按位AND结果,内存语义为setVolatile(java.lang.Object...)
,并返回变量的先前值,如内存语义getVolatile(java.lang.Object...)
所示 。如果变量类型是非整数
boolean
类型,则执行逻辑AND而不是按位AND。方法签名的格式为
(CT1 ct1, ..., CTn ctn, T mask)T
。呼叫站点
getAndBitwiseAnd
处的符号类型描述符必须与在此VarHandle上调用accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_AND)
的结果的访问模式类型匹配。- 参数
-
args
- 形式(CT1 ct1, ..., CTn ctn, T mask)
的签名多态参数列表,使用varargs静态表示。 - 结果
- 签名 - 多态结果,即变量的先前值,使用
Object
静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用ClassCastException
失败。 - 另请参见:
-
setVolatile(Object...)
,getVolatile(Object...)
-
getAndBitwiseAndAcquire
public final Object getAndBitwiseAndAcquire(Object... args)
原子地将变量的值设置为变量的当前值与mask
之间的按位AND结果,内存语义为set(java.lang.Object...)
,并返回变量的先前值,如内存语义getAcquire(java.lang.Object...)
所示 。如果变量类型是非整数
boolean
类型,则执行逻辑AND而不是按位AND。方法签名的格式为
(CT1 ct1, ..., CTn ctn, T mask)T
。调用站点
getAndBitwiseAndAcquire
处的符号类型描述符必须与在此VarHandle上调用accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_AND_ACQUIRE)
的结果的访问模式类型匹配。- 参数
-
args
- 形式为(CT1 ct1, ..., CTn ctn, T mask)
的签名多态参数列表,使用varargs静态表示。 - 结果
- 签名 - 多态结果,即变量的先前值,使用
Object
静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用ClassCastException
失败。 - 另请参见:
-
set(Object...)
,getAcquire(Object...)
-
getAndBitwiseAndRelease
public final Object getAndBitwiseAndRelease(Object... args)
原子地将变量的值设置为变量的当前值与mask
之间的按位AND结果,其内存语义为setRelease(java.lang.Object...)
,并返回变量的先前值,如内存语义get(java.lang.Object...)
所示 。如果变量类型是非整数
boolean
类型,则执行逻辑AND而不是按位AND。方法签名的格式为
(CT1 ct1, ..., CTn ctn, T mask)T
。调用站点
getAndBitwiseAndRelease
处的符号类型描述符必须与访问模式类型匹配,该访问模式类型是在此VarHandle上调用accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_AND_RELEASE)
的结果。- 参数
-
args
- 形式为(CT1 ct1, ..., CTn ctn, T mask)
的签名多态参数列表,使用varargs静态表示。 - 结果
- 签名 - 多态结果,即变量的先前值,使用
Object
静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用ClassCastException
失败。 - 另请参见:
-
setRelease(Object...)
,get(Object...)
-
getAndBitwiseXor
public final Object getAndBitwiseXor(Object... args)
原子地将变量的值设置为变量的当前值与mask
之间的按位异或结果,其内存语义为setVolatile(java.lang.Object...)
,并返回变量的先前值,如内存语义getVolatile(java.lang.Object...)
所示 。如果变量类型是非整数
boolean
类型,则执行逻辑XOR而不是按位异或。方法签名的格式为
(CT1 ct1, ..., CTn ctn, T mask)T
。调用站点
getAndBitwiseXor
处的符号类型描述符必须与在此VarHandle上调用accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_XOR)
的结果的访问模式类型匹配。- 参数
-
args
- 形式为(CT1 ct1, ..., CTn ctn, T mask)
的签名多态参数列表,使用varargs静态表示。 - 结果
- 签名 - 多态结果,即变量的先前值,使用
Object
静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用ClassCastException
失败。 - 另请参见:
-
setVolatile(Object...)
,getVolatile(Object...)
-
getAndBitwiseXorAcquire
public final Object getAndBitwiseXorAcquire(Object... args)
原子地将变量的值设置为变量的当前值与mask
之间的按位异或结果,其内存语义为set(java.lang.Object...)
,并返回变量的先前值,如内存语义getAcquire(java.lang.Object...)
所示 。如果变量类型是非整数
boolean
类型,则执行逻辑XOR而不是按位异或。方法签名的格式为
(CT1 ct1, ..., CTn ctn, T mask)T
。调用站点
getAndBitwiseXorAcquire
处的符号类型描述符必须与访问模式类型匹配,该访问模式类型是在此VarHandle上调用accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_XOR_ACQUIRE)
的结果。- 参数
-
args
- 形式(CT1 ct1, ..., CTn ctn, T mask)
的签名多态参数列表,使用varargs静态表示。 - 结果
- 签名 - 多态结果,即变量的先前值,使用
Object
静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用ClassCastException
失败。 - 另请参见:
-
set(Object...)
,getAcquire(Object...)
-
getAndBitwiseXorRelease
public final Object getAndBitwiseXorRelease(Object... args)
原子地将变量的值设置为变量的当前值与mask
之间的按位异或结果,其内存语义为setRelease(java.lang.Object...)
,并返回变量的先前值,如内存语义get(java.lang.Object...)
所示 。如果变量类型是非整数
boolean
类型,则执行逻辑XOR而不是按位异或。方法签名的格式为
(CT1 ct1, ..., CTn ctn, T mask)T
。调用站点
getAndBitwiseXorRelease
处的符号类型描述符必须与访问模式类型匹配,该访问模式类型是在此VarHandle上调用accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_XOR_RELEASE)
的结果。- 参数
-
args
- 形式(CT1 ct1, ..., CTn ctn, T mask)
的签名多态参数列表,使用varargs静态表示。 - 结果
- 签名 - 多态结果,即变量的先前值,使用
Object
静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用ClassCastException
失败。 - 另请参见:
-
setRelease(Object...)
,get(Object...)
-
varType
public final 类<?> varType()
返回此VarHandle引用的变量的变量类型。- 结果
- 此VarHandle引用的变量类型的变量
-
coordinateTypes
public final List<类<?>> coordinateTypes()
返回此VarHandle的坐标类型。- 结果
- 此VarHandle的坐标类型。 返回的列表是不可修改的
-
accessModeType
public final MethodType accessModeType(VarHandle.AccessMode accessMode)
获得此VarHandle的访问模式类型和给定的访问模式。访问模式类型的参数类型将包含一个前缀,该前缀是此VarHandle的坐标类型,后跟访问模式方法定义的其他类型。 访问模式类型的返回类型由访问模式方法的返回类型定义。
- 参数
-
accessMode
- 访问模式,对应于同名的签名 - 多态方法 - 结果
- 给定访问模式的访问模式类型
-
isAccessModeSupported
public final boolean isAccessModeSupported(VarHandle.AccessMode accessMode)
如果支持给定的访问模式,则返回true
,否则false
。返回给定访问模式的
false
值表示在调用相应的访问模式方法时抛出UnsupportedOperationException
。- 参数
-
accessMode
- 访问模式,对应于同名的签名 - 多态方法 - 结果
-
true
如果支持给定的访问模式),否则为false
。
-
toMethodHandle
public final MethodHandle toMethodHandle(VarHandle.AccessMode accessMode)
获取绑定到此VarHandle的方法句柄和给定的访问模式。- API Note:
- 对于VarHandle
vh
和访问模式{access-mode}
,此方法返回一个方法句柄,该句柄句柄bmh
于以下代码中的方法句柄bmh
(尽管它可能更有效):MethodHandle mh = MethodHandles.varHandleExactInvoker( vh.accessModeType(VarHandle.AccessMode.{access-mode})); MethodHandle bmh = mh.bindTo(vh);
- 参数
-
accessMode
- 访问模式,对应于同名的签名 - 多态方法 - 结果
- 绑定到此VarHandle的方法句柄和给定的访问模式
-
fullFence
public static void fullFence()
确保围栏之前的装载和存储不会在围栏之后与装载和存储重新排序。- API Note:
- 忽略C和C ++的许多语义差异,此方法具有与
atomic_thread_fence(memory_order_seq_cst)
兼容的内存排序效果
-
acquireFence
public static void acquireFence()
确保栅栏前的载荷不会在栅栏后的载荷和存储中重新排序。- API Note:
- 忽略C和C ++的许多语义差异,此方法具有与
atomic_thread_fence(memory_order_acquire)
兼容的内存排序效果
-
releaseFence
public static void releaseFence()
确保栅栏前的装载和存储不会在栅栏后与存储重新排序。- API Note:
- 忽略C和C ++的许多语义差异,此方法具有与
atomic_thread_fence(memory_order_release)
兼容的内存排序效果
-
loadLoadFence
public static void loadLoadFence()
确保栅栏前的载荷不会与栅栏后的载荷重新排序。
-
storeStoreFence
public static void storeStoreFence()
确保栅栏前的商店不会在栅栏后与商店重新订购。
-
-