- java.lang.Object
-
- java.lang.invoke.VarHandle
-
public abstract class VarHandle extends Object
VarHandle是对变量或参数定义的变量系列的动态强类型引用,包括静态字段,非静态字段,数组元素或非堆组数据结构的组件。 在各种访问模式下支持对这些变量的访问 ,包括简单的读/写访问,易读/写访问和比较和交换。VarHandles是不可变的,没有可见的状态。 VarHandles不能被用户子类化。
VarHandle有:
- 一个
variable type
T,这个VarHandle引用的每个变量的类型; 和 -
coordinate types
CT1, CT2, ..., CTn
的列表,共同定位由该VarHandle引用的变量的坐标表达式 。
Class
对象表示。 坐标类型列表可能为空。产生的工厂方法或
lookup
VarHandle实例记录支持的变量类型和坐标类型列表。每个访问模式都与一个访问模式方法相关联,一个signature polymorphic方法以访问模式命名。 当在VarHandle实例上调用访问模式方法时,调用的初始参数是坐标表达式,用于准确指出要访问变量的对象。 调用的跟踪参数表示对访问模式很重要的值。 例如,各种比较和设置或比较和交换访问模式需要变量的预期值和新值的两个尾随参数。
调用访问模式方法的参数的类型和类型不会静态检查。 相反,每个访问模式方法指定一个表示为
MethodType
的实例的access mode type
,用作一种方法签名,动态检查参数。 访问模式类型根据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位的原始值是按位原子,并且对执行线程以外的线程不施加可观察的排序约束。 相对于对同一变量的访问, 不透明的操作是按位原子和相干排列的。 除了遵守Opaque属性之外, Acquire模式读取及其后续访问在匹配Release模式写入及其之前的访问之后被排序。 除了遵守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
访问模式访问aa域的get
将访问其访问模式指定的字段,即使该字段声明为volatile
。 当执行混合访问时,应该非常小心,因为Java内存模型可能允许令人惊讶的结果。除了支持对各种访问模式下的变量的访问之外,还提供了一组静态方法,称为内存栅栏方法,用于对存储器排序的细粒度控制。 Java语言规范允许其他线程观察操作,就像它们是按照程序源代码中显而易见的顺序执行的,受制于例如使用锁,
volatile
字段或VarHandles的限制。 静态方法,fullFence
,acquireFence
,releaseFence
,loadLoadFence
和storeStoreFence
,还可以用来施加约束。 他们的规格与特定访问模式的情况一样,是以缺乏“重新排序”的方式表达的 - 如果栅栏不存在可能会发生可能发生的排序效应。 访问模式方法和内存围栏方法规范的更准确的措辞可能与Java语言规范的未来更新有关。编译访问模式方法的调用
命名访问模式方法的Java方法调用表达式可以从Java源代码调用VarHandle。 从源代码的角度来看,这些方法可以采用任何参数,并且可以将它们的多态结果(如果表达式)转换为任何返回类型。 正式地,这是通过给出访问模式方法变量Object
参数和Object
返回类型(如果返回类型是多态的),但它们具有称为签名多态性的附加质量,将这种调用自由直接连接到JVM执行堆栈。像虚拟方法一样,源级调用访问模式方法编译为一个
invokevirtual
指令。 更奇怪的是,编译器必须记录实际的参数类型,并且可能不会对参数执行方法调用转换。 相反,它必须根据自己的未转换类型生成指令,将其推送到堆栈上。 在参数之前,VarHandle对象本身将被推送到栈上。 编译器然后生成一个invokevirtual
指令,该指令使用描述参数和返回类型的符号类型描述符来调用访问模式方法。要发出一个完整的符号类型描述符,编译器还必须确定返回类型(如果是多态)。 这是基于对方法调用表达一个演员,如果有,否则
Object
如果调用是一个表达式,否则void
如果调用的声明。 演员可能是原始类型(但不是void
)。为角情况下,uncasted
null
给出参数的象征性类型描述符java.lang.Void
。 与类型Void
的歧义是无害的,因为没有引用类型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或扩展原始值,如同通过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的程序。因为访问模式类型包含“live”
Class
对象,方法类型匹配同时考虑了类型名称和类加载器。 因此,即使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,直接访问该代码可访问的任何字段。 这是通过一个反映出基于能力的APIMethodHandles.Lookup
完成的 。 例如,可以从Lookup.findVarHandle
获取非静态字段的VarHandle 。 Core Reflection API对象也有一个转换方法,Lookup.unreflectVarHandle
。对受保护的字段成员的访问仅限于访问类或其子类之一的接收者,而访问类又必须是受保护成员定义类的子类(或包兄弟)。 如果VarHandle是指当前包之外的声明类的受保护非静态字段,则接收器参数将被缩小为访问类的类型。
VarHandles与Core Reflection API的互操作
在Lookup
API中使用工厂方法,由Core Reflection API对象表示的任何字段都可以转换为行为上等效的VarHandle。 例如,反射Field
可以使用Lookup.unreflectVarHandle
转换为VarHandle 。 所产生的VarHandles通常提供更直接和有效的访问底层字段。作为一种特殊情况,当Core Reflection API用于查看此类中的签名多态访问模式方法时,它们显示为普通非多态方法。 由
Class.getDeclaredMethod
所观察到的反光外观不受其在该API中的特殊状态的影响。 例如,Method.getModifiers
将精确地报告任何类似声明的方法所需的修改位,包括在这种情况下为native
和varargs
位。与任何反映的方法一样,这些方法(反映时)可以通过JNI直接通过
java.lang.reflect.Method.invoke
调用,或通过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,例如aa字段,它使用Java通用类型声明。 与Core Reflection API一样,VarHandle的变量类型将由源级类型的擦除构成。 当调用VarHandle访问模式方法时,其参数或返回值转换类型的类型可能是通用类型或类型实例。 如果发生这种情况,编译器将在构建invokevirtual
指令的符号类型描述符时,通过其擦除来替换这些类型。- 从以下版本开始:
- 9
- 另请参见:
-
MethodHandle
,MethodHandles
,MethodType
- 一个
-
-
Nested Class Summary
Nested Classes Modifier and Type Class 描述 static class
VarHandle.AccessMode
指定如何访问由VarHandle引用的变量的访问模式集。
-
方法摘要
所有方法 静态方法 接口方法 具体的方法 Modifier and Type 方法 描述 MethodType
accessModeType(VarHandle.AccessMode accessMode)
获取此VarHandle和给定访问模式的访问模式类型。static void
acquireFence()
确保栅栏之前的载荷在栅栏后不会被装载和存储重新排序。Object
compareAndExchange(Object... args)
以原子方式设置的变量的值newValue
用的存储器语义setVolatile(java.lang.Object...)
,如果该变量的当前值,被称为 证人值 ,==
的expectedValue
,与的存储器访问语义getVolatile(java.lang.Object...)
。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<Class<?>>
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)
Object
getAndBitwiseAndAcquire(Object... args)
将变量的值原子设置为变量当前值与mask
之间按位AND的结果,其内存语义为set(java.lang.Object...)
,并返回变量的上一个值,内存语义为getAcquire(java.lang.Object...)
。Object
getAndBitwiseAndRelease(Object... args)
Object
getAndBitwiseOr(Object... args)
Object
getAndBitwiseOrAcquire(Object... args)
Object
getAndBitwiseOrRelease(Object... args)
Object
getAndBitwiseXor(Object... args)
Object
getAndBitwiseXorAcquire(Object... args)
将变量的值原子设置为变量的当前值与mask
的存储器语义的 mask之间的按位XOR的结果,并返回变量的上一个值,如使用内存语义getAcquire(java.lang.Object...)
访问的。Object
getAndBitwiseXorRelease(Object... args)
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和给定访问模式的方法句柄。Class<?>
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
- 使用varargs静态表示的表单(CT1 ct1, ..., CTn)
的签名 - 多态参数列表。 - 结果
-
作为变量值的签名 - 多态结果,使用
Object
静态表示。 - 异常
-
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但参考转换失败。
-
set
public final void set(Object... args)
将变量的值设置为newValue
,具有设置的内存语义,就像变量被声明为非volatile
和非final
。 通常被称为普通写访问。方法签名的格式为
(CT1 ct1, ..., CTn ctn, T newValue)void
set
呼叫站点上的符号类型描述符必须与该accessModeType(VarHandle.AccessMode.SET)
上调用accessModeType(VarHandle.AccessMode.SET)
的访问模式类型相匹配。- 参数
-
args
- 使用varargs静态表示的表单(CT1 ct1, ..., CTn ctn, T newValue)
的签名 - 多态参数列表。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但参考转换失败。
-
getVolatile
public final Object getVolatile(Object... args)
返回变量的值,读取的内存语义就像变量声明为volatile
。方法签名的格式为
(CT1 ct1, ..., CTn ctn)T
。getVolatile
的呼叫站点的符号类型描述符必须与访问模式类型匹配,该类型是在此VarHandle上调用accessModeType(VarHandle.AccessMode.GET_VOLATILE)
的结果。- 参数
-
args
- 使用varargs静态表示的表单(CT1 ct1, ..., CTn ctn)
的签名 - 多态参数列表。 - 结果
-
作为变量值的签名 - 多态结果,使用
Object
静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
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
- 使用varargs静态表示的表单(CT1 ct1, ..., CTn ctn, T newValue)
的签名 - 多态参数列表。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但参考转换失败。
-
getOpaque
public final Object getOpaque(Object... args)
返回以程序顺序访问的变量的值,但不能保证相对于其他线程的内存排序效果。方法签名的格式为
(CT1 ct1, ..., CTn ctn)T
。呼叫站点
getOpaque
处的符号类型描述符必须与访问模式类型匹配,该类型是在此VarHandle上调用accessModeType(VarHandle.AccessMode.GET_OPAQUE)
的结果。- 参数
-
args
- 使用varargs静态表示的表单(CT1 ct1, ..., CTn ctn)
的签名 - 多态参数列表。 - 结果
-
作为变量值的签名 - 多态结果,使用
Object
静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但参考转换失败。
-
setOpaque
public final void setOpaque(Object... args)
以程序顺序将变量的值设置为newValue
,但不能保证与其他线程相关的内存排序效果。方法签名的格式为
(CT1 ct1, ..., CTn ctn, T newValue)void
。setOpaque
呼叫站点上的符号类型描述符必须与访问模式类型匹配,该类型是在此VarHandle上调用accessModeType(VarHandle.AccessMode.SET_OPAQUE)
的结果。- 参数
-
args
- 使用varargs静态表示的表单(CT1 ct1, ..., CTn ctn, T newValue)
的签名 - 多态参数列表。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但参考转换失败。
-
getAcquire
public final Object getAcquire(Object... args)
返回变量的值,并确保后续加载和存储在此访问之前未重新排序。方法签名的格式为
(CT1 ct1, ..., CTn ctn)T
。getAcquire
呼叫站点上的符号类型描述符必须与访问模式类型匹配,该类型是此accessModeType(VarHandle.AccessMode.GET_ACQUIRE)
上调用accessModeType(VarHandle.AccessMode.GET_ACQUIRE)
的结果。- API Note:
-
忽略C和C ++的许多语义差异,该方法具有与
memory_order_acquire
订购兼容的内存订购效果。 - 参数
-
args
- 使用varargs静态表示的表单(CT1 ct1, ..., CTn ctn)
的签名 - 多态参数列表。 - 结果
-
作为变量值的签名 - 多态结果,使用
Object
静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
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
- 使用varargs静态表示的表单(CT1 ct1, ..., CTn ctn, T newValue)
的签名 - 多态参数列表。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
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
呼叫站点上的符号类型描述符必须与此accessModeType(VarHandle.AccessMode.COMPARE_AND_SET)
上调用accessModeType(VarHandle.AccessMode.COMPARE_AND_SET)
结果的访问模式类型相匹配。- 参数
-
args
- 使用varargs静态表示的表单(CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)
的签名多态参数列表。 - 结果
-
true
如果成功,否则false
如果见证值与expectedValue
不一样。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
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
呼叫站点的符号类型描述符必须与该accessModeType(VarHandle.AccessMode.COMPARE_AND_EXCHANGE)
上调用accessModeType(VarHandle.AccessMode.COMPARE_AND_EXCHANGE)
的访问模式类型相匹配。- 参数
-
args
- 使用varargs静态表示的表单(CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)
的签名 - 多态参数列表。 - 结果
-
作为见证值的签名多态结果,如果成功,将与
expectedValue
相同,使用Object
静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与呼叫者的符号类型描述符不兼容。 -
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
- 使用varargs静态表示的表单(CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)
的签名 - 多态参数列表。 - 结果
-
作为见证值的签名多态结果,如果成功,将与
expectedValue
相同,使用Object
静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
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
的呼叫站点上的符号类型描述符必须与此accessModeType(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE)
上调用accessModeType(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE)
结果的访问模式类型相匹配。- 参数
-
args
- 使用varargs静态表示的表单(CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)
的签名 - 多态参数列表。 - 结果
-
作为见证值的签名多态结果,如果成功,将与
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
- 使用varargs静态表示的表单(CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)
的签名 - 多态参数列表。 - 结果
-
true
如果成功,否则false
如果见证值与expectedValue
或者这个操作是否虚假失败。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
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
- 使用varargs静态表示的表单(CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)
的签名 - 多态参数列表。 - 结果
-
true
如果成功,否则为false
如果见证值与expectedValue
或者这个操作是否虚假失败。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
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
呼叫站点上的符号类型描述符必须与该accessModeType(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE)
上调用accessModeType(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE)
的访问模式类型相匹配。- 参数
-
args
- 使用varargs静态表示的表单(CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)
的签名 - 多态参数列表。 - 结果
-
true
如果成功,否则为false
如果见证值与expectedValue
或者这个操作是否虚假失败。 - 异常
-
UnsupportedOperationException
- 如果该VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
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
呼叫站点上的符号类型描述符必须与此accessModeType(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)
上调用accessModeType(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)
的访问模式类型相匹配。- 参数
-
args
- 使用varargs静态表示的表单(CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)
的签名 - 多态参数列表。 - 结果
-
true
如果成功,否则false
如果见证值与expectedValue
或者这个操作是否虚假失败。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
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
的呼叫站点上的符号类型描述符必须与此accessModeType(VarHandle.AccessMode.GET_AND_SET)
上调用accessModeType(VarHandle.AccessMode.GET_AND_SET)
的访问模式类型相匹配。- 参数
-
args
- 使用varargs静态表示的表单(CT1 ct1, ..., CTn ctn, T newValue)
的签名 - 多态参数列表。 - 结果
-
该变量的前一个值的签名 - 多态结果,使用
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
的呼叫站点的符号类型描述符必须与访问模式类型匹配,该类型是此accessModeType(VarHandle.AccessMode.GET_AND_SET_ACQUIRE)
上调用accessModeType(VarHandle.AccessMode.GET_AND_SET_ACQUIRE)
的结果。- 参数
-
args
- 使用varargs静态表示的表单(CT1 ct1, ..., CTn ctn, T newValue)
的签名 - 多态参数列表。 - 结果
-
该变量的前一个值的签名 - 多态结果,使用
Object
静态表示。 - 异常
-
UnsupportedOperationException
- 如果该VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
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
- 使用varargs静态表示的表单(CT1 ct1, ..., CTn ctn, T newValue)
的签名 - 多态参数列表。 - 结果
-
作为变量前一个值的签名 - 多态结果,使用
Object
静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
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
- 使用varargs静态表示的表单(CT1 ct1, ..., CTn ctn, T value)
的签名 - 多态参数列表。 - 结果
-
使用
Object
静态表示的变量的前一个值的签名 - 多态结果。 - 异常
-
UnsupportedOperationException
- 如果该VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
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
呼叫站点上的符号类型描述符必须与该accessModeType(VarHandle.AccessMode.GET_AND_ADD_ACQUIRE)
上调用accessModeType(VarHandle.AccessMode.GET_AND_ADD_ACQUIRE)
的访问模式类型相匹配。- 参数
-
args
- 使用varargs静态表示的表单(CT1 ct1, ..., CTn ctn, T value)
的签名 - 多态参数列表。 - 结果
-
该变量的前一个值的签名 - 多态结果,使用
Object
静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
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
的呼叫站点上的符号类型描述符必须与该accessModeType(VarHandle.AccessMode.GET_AND_ADD_RELEASE)
上调用accessModeType(VarHandle.AccessMode.GET_AND_ADD_RELEASE)
结果的访问模式类型相匹配。- 参数
-
args
- 使用varargs静态表示的表单(CT1 ct1, ..., CTn ctn, T value)
的签名 - 多态参数列表。 - 结果
-
该变量的前一个值的签名 - 多态结果,使用
Object
静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但参考转换失败。 - 另请参见:
-
setVolatile(Object...)
,getVolatile(Object...)
-
getAndBitwiseOr
public final Object getAndBitwiseOr(Object... args)
在变量的当前值和mask
的存储器语义为setVolatile(java.lang.Object...)
之间,将变量的值原子设置为按位OR的结果,并返回变量的上一个值,并使用存储器语义getVolatile(java.lang.Object...)
访问。如果变量类型是非整数
boolean
类型,则执行逻辑或代替按位OR。方法签名的格式为
(CT1 ct1, ..., CTn ctn, T mask)T
。getAndBitwiseOr
呼叫站点上的符号类型描述符必须与此accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_OR)
上调用accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_OR)
的访问模式类型相匹配。- 参数
-
args
- 使用varargs静态表示的表单(CT1 ct1, ..., CTn ctn, T mask)
的签名 - 多态参数列表。 - 结果
-
该变量的前一个值的签名 - 多态结果,使用
Object
静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但参考转换失败。 - 另请参见:
-
setVolatile(Object...)
,getVolatile(Object...)
-
getAndBitwiseOrAcquire
public final Object getAndBitwiseOrAcquire(Object... args)
将变量的值原子设置为变量当前值与mask
的存储器语义的mask之间的按位OR的结果,并返回变量的先前值,如使用内存语义getAcquire(java.lang.Object...)
访问的。如果变量类型是非整数
boolean
类型,则执行逻辑或代替按位OR。方法签名的格式为
(CT1 ct1, ..., CTn ctn, T mask)T
。getAndBitwiseOrAcquire
的呼叫站点上的符号类型描述符必须与访问模式类型匹配,该类型是在此VarHandle上调用accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_OR_ACQUIRE)
的结果。- 参数
-
args
- 使用varargs静态表示的表单(CT1 ct1, ..., CTn ctn, T mask)
的签名 - 多态参数列表。 - 结果
-
该变量的前一个值的签名 - 多态结果,使用
Object
静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但参考转换失败。 - 另请参见:
-
set(Object...)
,getAcquire(Object...)
-
getAndBitwiseOrRelease
public final Object getAndBitwiseOrRelease(Object... args)
将变量的值原子设置为变量的当前值与mask
的存储器语义的mask之间的按位OR的结果,并返回变量的先前值,如使用内存语义get(java.lang.Object...)
访问的。如果变量类型是非整数
boolean
类型,则执行逻辑或代替按位OR。方法签名的格式为
(CT1 ct1, ..., CTn ctn, T mask)T
。getAndBitwiseOrRelease
呼叫站点上的符号类型描述符必须与在此VarHandle上调用accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_OR_RELEASE)
的结果匹配访问模式类型。- 参数
-
args
- 使用varargs静态表示的表单(CT1 ct1, ..., CTn ctn, T mask)
的签名 - 多态参数列表。 - 结果
-
该变量的前一个值的签名 - 多态结果,使用
Object
静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但参考转换失败。 - 另请参见:
-
setRelease(Object...)
,get(Object...)
-
getAndBitwiseAnd
public final Object getAndBitwiseAnd(Object... args)
原子地将变量的值设置为变量当前值与mask
的存储器语义的mask之间的按位AND的结果,并返回变量的先前值,如使用存储器语义getVolatile(java.lang.Object...)
访问的。如果变量类型是非整数
boolean
类型,则执行逻辑“与”而不是按位AND。方法签名的格式为
(CT1 ct1, ..., CTn ctn, T mask)T
。getAndBitwiseAnd
的呼叫站点上的符号类型描述符必须与该accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_AND)
上调用accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_AND)
的访问模式类型相匹配。- 参数
-
args
- 使用varargs静态表示的表单(CT1 ct1, ..., CTn ctn, T mask)
的签名 - 多态参数列表。 - 结果
-
该变量的前一个值的签名 - 多态结果,使用
Object
静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但参考转换失败。 - 另请参见:
-
setVolatile(Object...)
,getVolatile(Object...)
-
getAndBitwiseAndAcquire
public final Object getAndBitwiseAndAcquire(Object... args)
原子地将变量的值设置为变量当前值与mask
的内存语义的mask之间的按位AND的结果,并返回变量的先前值,如使用内存语义getAcquire(java.lang.Object...)
访问的。如果变量类型是非整数
boolean
类型,则执行逻辑与而不是按位AND。方法签名的格式为
(CT1 ct1, ..., CTn ctn, T mask)T
。getAndBitwiseAndAcquire
呼叫站点的符号类型描述符必须与访问模式类型匹配,该类型是在此VarHandle上调用accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_AND_ACQUIRE)
的结果。- 参数
-
args
- 使用varargs静态表示的表单(CT1 ct1, ..., CTn ctn, T mask)
的签名 - 多态参数列表。 - 结果
-
该变量的前一个值的签名 - 多态结果,使用
Object
静态表示。 - 异常
-
UnsupportedOperationException
- 如果该VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但参考转换失败。 - 另请参见:
-
set(Object...)
,getAcquire(Object...)
-
getAndBitwiseAndRelease
public final Object getAndBitwiseAndRelease(Object... args)
原子地将变量的值设置为变量当前值与mask
的存储器语义的mask之间的按位AND的结果,并返回变量的先前值,内存语义为get(java.lang.Object...)
。如果变量类型是非整数
boolean
类型,则执行逻辑“与”而不是按位“和”。方法签名的格式为
(CT1 ct1, ..., CTn ctn, T mask)T
。getAndBitwiseAndRelease
的呼叫站点上的符号类型描述符必须与访问模式类型匹配,该类型是在此VarHandle上调用accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_AND_RELEASE)
的结果。- 参数
-
args
- 使用varargs静态表示的表单(CT1 ct1, ..., CTn ctn, T mask)
的签名 - 多态参数列表。 - 结果
-
该变量的前一个值的签名 - 多态结果,使用
Object
静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但参考转换失败。 - 另请参见:
-
setRelease(Object...)
,get(Object...)
-
getAndBitwiseXor
public final Object getAndBitwiseXor(Object... args)
将变量的值原子地设置为变量当前值与mask
的存储器语义的mask之间的按位XOR的结果,并返回变量的上一个值,如getVolatile(java.lang.Object...)
的存储器语义访问。如果变量类型是非整数
boolean
类型,则执行逻辑异或,而不是按位XOR。方法签名的格式为
(CT1 ct1, ..., CTn ctn, T mask)T
。getAndBitwiseXor
呼叫站点上的符号类型描述符必须与访问模式类型匹配,该类型是在此VarHandle上调用accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_XOR)
的结果。- 参数
-
args
- 使用varargs静态表示的表单(CT1 ct1, ..., CTn ctn, T mask)
的签名 - 多态参数列表。 - 结果
-
该变量的前一个值的签名 - 多态结果,使用
Object
静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但参考转换失败。 - 另请参见:
-
setVolatile(Object...)
,getVolatile(Object...)
-
getAndBitwiseXorAcquire
public final Object getAndBitwiseXorAcquire(Object... args)
将变量的值原子设置为变量当前值与mask
的内存语义的mask之间的按位XOR的结果,并返回变量的上一个值,内存语义为getAcquire(java.lang.Object...)
。如果变量类型是非整数
boolean
类型,则执行逻辑异或,而不是按位XOR。方法签名的格式为
(CT1 ct1, ..., CTn ctn, T mask)T
。getAndBitwiseXorAcquire
呼叫站点上的符号类型描述符必须与该accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_XOR_ACQUIRE)
上调用accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_XOR_ACQUIRE)
的结果相匹配。- 参数
-
args
- 使用varargs静态表示的表单(CT1 ct1, ..., CTn ctn, T mask)
的签名 - 多态参数列表。 - 结果
-
该变量的前一个值的签名 - 多态结果,使用
Object
静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但参考转换失败。 - 另请参见:
-
set(Object...)
,getAcquire(Object...)
-
getAndBitwiseXorRelease
public final Object getAndBitwiseXorRelease(Object... args)
将变量的值原子设置为变量当前值与mask
的存储器语义的mask之间的按位XOR的结果,并返回变量的上一个值,内存语义为get(java.lang.Object...)
。如果变量类型是非整数
boolean
类型,则执行逻辑异或,而不是按位XOR。方法签名的格式为
(CT1 ct1, ..., CTn ctn, T mask)T
。呼叫站点
getAndBitwiseXorRelease
的符号类型描述符必须与访问模式类型匹配,该类型是在此VarHandle上调用accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_XOR_RELEASE)
的结果。- 参数
-
args
- 使用varargs静态表示的表单(CT1 ct1, ..., CTn ctn, T mask)
的签名 - 多态参数列表。 - 结果
-
该变量的前一个值的签名 - 多态结果,使用
Object
静态表示。 - 异常
-
UnsupportedOperationException
- 如果此VarHandle不支持访问模式。 -
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。 -
ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但参考转换失败。 - 另请参见:
-
setRelease(Object...)
,get(Object...)
-
varType
public final Class<?> varType()
返回此VarHandle引用的变量的变量类型。- 结果
- 该VarHandle引用的变量变量类型
-
coordinateTypes
public final List<Class<?>> 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
方法句柄(尽管可能会更有效):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()
确保栅栏之前的商店在栅栏后不会与商店重新排列。
-
-