- 所有已实现的接口:
Constable
VarHandles 是不可变的并且没有可见状态。 VarHandles 不能被用户子类化。
VarHandle 具有:
- a
variable type
T,此VarHandle引用的每个变量的类型;和 coordinate types
CT1, CT2, ..., CTn
的列表, coordinate expressions 的类型共同定位此 VarHandle 引用的变量。
Class
个对象表示。坐标类型列表可能为空。
生产 lookup
VarHandle 实例的工厂方法记录了支持的变量类型和坐标类型列表。
每个访问模式都与一个 access mode method 相关联,一个以访问模式命名的 签名多态 方法。当在 VarHandle 实例上调用访问模式方法时,调用的初始参数是坐标表达式,精确指示要在哪个对象中访问变量。调用的尾随参数表示访问模式的重要性值。例如,各种比较和设置或比较和交换访问模式需要变量的期望值和新值的两个尾随参数。
不静态检查调用访问模式方法的参数的数量和类型。相反,每个访问模式方法都指定一个 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
。此 VarHandle 实例上 compareAndSet
的访问模式类型为 (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");
访问模式控制原子性和一致性属性。 Plain 读 (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
、 - 按位原子更新访问模式,例如,在指定的内存排序效果下原子地获取和按位或变量的值。属于该组的相应访问模式方法集包括方法
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
访问模式访问字段的 VarHandle 将按照指定的 by its access mode 访问该字段,即使该字段声明为 volatile
也是如此。执行混合访问时应格外小心,因为 Java 内存模型可能会产生意想不到的结果。
除了支持在各种访问模式下访问变量,还提供了一组静态方法,称为内存栅栏方法,用于对内存排序的细粒度控制。 Java 语言规范允许其他线程观察操作,就好像它们是以不同于程序源代码中明显的顺序执行的那样,受到产生的约束,例如,来自锁、volatile
字段或 VarHandles 的使用。静态方法 fullFence
、 acquireFence
、 releaseFence
、 loadLoadFence
和 storeStoreFence
也可用于施加约束。与某些访问模式的情况一样,它们的规范是根据缺乏“重新排序”来表述的——如果没有栅栏,则可能会发生可观察到的排序效果。访问模式方法和内存栅栏方法的规范的更精确的措辞可能伴随 Java 语言规范的未来更新。
编译访问模式方法的调用
命名访问模式方法的 Java 方法调用表达式可以从 Java 源代码调用 VarHandle。从源代码的角度来看,这些方法可以接受任何参数,并且它们的多态结果(如果表示)可以转换为任何返回类型。形式上,这是通过为访问模式方法提供变量 arityObject
arguments 和 Object
return types(如果返回类型是多态的)来实现的,但是它们具有称为 signature polymorphism 的附加特性,它将这种调用自由直接连接到 JVM 执行堆栈。
与虚拟方法一样,对访问模式方法的源代码级调用编译为 invokevirtual
指令。更不寻常的是,编译器必须记录实际的参数类型,并且可能不会对参数执行方法调用转换。相反,它必须生成指令,根据它们自己未转换的类型将它们压入堆栈。 VarHandle 对象本身将在参数之前被压入堆栈。然后,编译器生成一条 invokevirtual
指令,该指令使用描述参数和返回类型的符号类型描述符调用访问模式方法。
要发出完整的符号类型描述符,编译器还必须确定返回类型(如果是多态的)。这是基于对方法调用表达式的强制转换(如果有),或者如果调用是表达式则为 Object
,如果调用是语句则为 void
。转换可能是原始类型(但不是 void
)。
作为极端情况,未转换的 null
参数被赋予 java.lang.Void
的符号类型描述符。 Void
类型的歧义是无害的,因为除了 null 引用之外没有 Void
类型的引用。
执行访问模式方法的调用
第一次执行invokevirtual
指令时,通过符号解析指令中的名称并验证方法调用是否静态合法来链接它。这也适用于访问模式方法的调用。在这种情况下,将检查编译器发出的符号类型描述符的语法是否正确,并解析其中包含的名称。因此,调用访问模式方法的 invokevirtual
指令将始终链接,只要符号类型描述符在句法上格式正确并且类型存在。
链接后执行invokevirtual
时,JVM 首先检查接收 VarHandle 的访问模式类型,以确保它与符号类型描述符匹配。如果类型匹配失败,则意味着调用者正在调用的访问模式方法不存在于正在调用的单个 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...)
,因为在调用目标之前,句柄将根据需要应用引用强制转换和装箱、拆箱或加宽原始值,就像通过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 实例。
可以调整 VarHandle 的调用行为(请参阅 withInvokeExactBehavior()
),这样访问模式方法的调用就像调用 MethodHandle.invokeExact(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.invokeExact(vh, p1, p2, ..., pN)
(模访问模式方法不声明抛出 Throwable
)。更简洁地说,这种行为等同于:
VarHandle vh = ..
VarHandle.AccessMode am = VarHandle.AccessMode.valueFromMethodName("{access-mode}");
MethodHandle mh = vh.toMethodHandle(am);
R r = (R) mh.invokeExact(p1, p2, ..., pN)
其中,在这种情况下,方法句柄绑定到 VarHandle 实例。
调用检查
在典型的程序中,VarHandle 访问模式类型匹配通常会成功。但如果匹配失败,JVM 将抛出一个WrongMethodTypeException
。
因此,在静态类型程序中可能显示为链接错误的访问模式类型不匹配在使用 VarHandles 的程序中可能显示为动态 WrongMethodTypeException
。
因为访问模式类型包含“活动的”Class
对象,所以方法类型匹配会同时考虑类型名称和类加载器。因此,即使 VarHandle VH
在一个类加载器 L1
中创建并在另一个类加载器 L2
中使用,VarHandle 访问模式方法调用也是类型安全的,因为调用者的符号类型描述符(在 L2
中解析)与原始被调用方法的符号类型匹配类型描述符,在 L1
中解决。 L1
中的解析发生在创建 VH
并分配其访问模式类型时,而 L2
中的解析发生在链接 invokevirtual
指令时。
除了类型描述符检查之外,VarHandles 访问其变量的能力不受限制。如果 VarHandle 由有权访问该变量的类在非公共变量上形成,则生成的 VarHandle 可以由接收到它的引用的任何调用者在任何地方使用。
与 Core Reflection API 不同,每次调用反射方法时都会检查访问权限,VarHandle 访问权限检查是执行的创建VarHandle时。因此,非公共变量或非公共类中的变量的 VarHandles 通常应该保密。它们不应传递给不受信任的代码,除非不受信任的代码使用它们是无害的。
VarHandle 创建
Java 代码可以创建一个 VarHandle,它可以直接访问该代码可以访问的任何字段。这是通过名为MethodHandles.Lookup
的反射式、基于功能的 API 完成的。例如,可以从 Lookup.findVarHandle
获得非静态字段的 VarHandle。还有一个来自 Core Reflection API 对象的转换方法,Lookup.unreflectVarHandle
。
对受保护字段成员的访问仅限于访问类或其子类之一的接收者,并且访问类必须反过来是受保护成员定义类的子类(或包兄弟)。如果 VarHandle 引用当前包外的声明类的受保护非静态字段,则接收者参数将缩小为访问类的类型。
VarHandles 和 Core Reflection API 之间的互操作
使用Lookup
API 中的工厂方法,可以将核心反射 API 对象表示的任何字段转换为行为等效的 VarHandle。例如,可以使用 Lookup.unreflectVarHandle
将反射 Field
转换为 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 泛型之间的互操作
可以为使用 Java 泛型类型声明的变量(例如字段)获取 VarHandle。与 Core Reflection API 一样,VarHandle 的变量类型将从源级类型的擦除中构造。当调用 VarHandle 访问模式方法时,其参数类型或返回值转换类型可能是泛型类型或类型实例。如果发生这种情况,编译器将在为invokevirtual
指令构造符号类型描述符时用擦除替换这些类型。
- 自从:
- 9
- 参见:
-
内部类总结
内部类修饰符和类型类描述static enum
一组访问模式,指定如何访问 VarHandle 引用的变量。static final class
-
方法总结
修饰符和类型方法描述final MethodType
accessModeType
(VarHandle.AccessMode accessMode) 获取此 VarHandle 的访问模式类型和给定的访问模式。static void
确保栅栏前的负载不会与栅栏后的负载和存储重新排序。final Object
compareAndExchange
(Object... args) 如果变量的当前值被称为 witness value、==
和expectedValue
,使用getVolatile(java.lang.Object...)
的内存语义访问,则以原子方式将变量的值设置为具有setVolatile(java.lang.Object...)
的内存语义的newValue
。final Object
compareAndExchangeAcquire
(Object... args) 如果变量的当前值被称为 witness value、==
和expectedValue
,使用getAcquire(java.lang.Object...)
的内存语义访问,则以原子方式将变量的值设置为具有set(java.lang.Object...)
的内存语义的newValue
。final Object
compareAndExchangeRelease
(Object... args) 如果变量的当前值被称为 witness value、==
和expectedValue
,使用get(java.lang.Object...)
的内存语义访问,则以原子方式将变量的值设置为具有setRelease(java.lang.Object...)
的内存语义的newValue
。final boolean
compareAndSet
(Object... args) 如果变量的当前值被称为 witness value、==
和expectedValue
,使用getVolatile(java.lang.Object...)
的内存语义访问,则以原子方式将变量的值设置为具有setVolatile(java.lang.Object...)
的内存语义的newValue
。返回此 VarHandle 的坐标类型。如果可以构造,则返回此实例的标称描述符,如果不能构造,则返回一个空的Optional
。static void
确保栅栏之前的装载和存储不会与栅栏之后的装载和存储重新排序。final Object
返回变量的值,具有读取的内存语义,就好像变量被声明为 non-volatile
一样。final Object
getAcquire
(Object... args) 返回变量的值,并确保后续加载和存储在此访问之前不会重新排序。final Object
以原子方式将value
添加到具有setVolatile(java.lang.Object...)
内存语义的变量的当前值,并返回变量的先前值,如使用getVolatile(java.lang.Object...)
内存语义访问的那样。final Object
getAndAddAcquire
(Object... args) 以原子方式将value
添加到具有set(java.lang.Object...)
内存语义的变量的当前值,并返回变量的先前值,如使用getAcquire(java.lang.Object...)
内存语义访问的那样。final Object
getAndAddRelease
(Object... args) 以原子方式将value
添加到具有setRelease(java.lang.Object...)
内存语义的变量的当前值,并返回变量的先前值,如使用get(java.lang.Object...)
内存语义访问的那样。final Object
getAndBitwiseAnd
(Object... args) 原子地将变量的值设置为变量的当前值与具有setVolatile(java.lang.Object...)
的内存语义的mask
之间的按位与的结果,并返回变量的先前值,如使用getVolatile(java.lang.Object...)
的内存语义访问的那样。final Object
getAndBitwiseAndAcquire
(Object... args) 原子地将变量的值设置为变量的当前值与具有set(java.lang.Object...)
的内存语义的mask
之间的按位与的结果,并返回变量的先前值,如使用getAcquire(java.lang.Object...)
的内存语义访问的那样。final Object
getAndBitwiseAndRelease
(Object... args) 以原子方式将变量的值设置为变量的当前值与具有setRelease(java.lang.Object...)
的内存语义的mask
之间的按位与的结果,并返回变量的先前值,如使用get(java.lang.Object...)
的内存语义访问的那样。final Object
getAndBitwiseOr
(Object... args) 原子地将变量的值设置为变量的当前值与具有setVolatile(java.lang.Object...)
的内存语义的mask
之间按位或的结果,并返回变量的先前值,如使用getVolatile(java.lang.Object...)
的内存语义访问的那样。final Object
getAndBitwiseOrAcquire
(Object... args) 原子地将变量的值设置为变量的当前值与具有set(java.lang.Object...)
的内存语义的mask
之间的按位或的结果,并返回变量的先前值,如使用getAcquire(java.lang.Object...)
的内存语义访问的那样。final Object
getAndBitwiseOrRelease
(Object... args) 以原子方式将变量的值设置为变量的当前值与具有setRelease(java.lang.Object...)
的内存语义的mask
之间按位或的结果,并返回变量的先前值,如使用get(java.lang.Object...)
的内存语义访问的那样。final Object
getAndBitwiseXor
(Object... args) 以原子方式将变量的值设置为变量的当前值与具有setVolatile(java.lang.Object...)
的内存语义的mask
之间按位异或的结果,并返回变量的先前值,如使用getVolatile(java.lang.Object...)
的内存语义访问的那样。final Object
getAndBitwiseXorAcquire
(Object... args) 以原子方式将变量的值设置为变量的当前值与具有set(java.lang.Object...)
的内存语义的mask
之间按位异或的结果,并返回变量的先前值,如使用getAcquire(java.lang.Object...)
的内存语义访问的那样。final Object
getAndBitwiseXorRelease
(Object... args) 以原子方式将变量的值设置为变量的当前值与具有setRelease(java.lang.Object...)
的内存语义的mask
之间按位异或的结果,并返回变量的先前值,如使用get(java.lang.Object...)
的内存语义访问的那样。final Object
以原子方式将变量的值设置为具有setVolatile(java.lang.Object...)
的内存语义的newValue
并返回变量的先前值,如使用getVolatile(java.lang.Object...)
的内存语义访问的那样。final Object
getAndSetAcquire
(Object... args) 以原子方式将变量的值设置为具有set(java.lang.Object...)
的内存语义的newValue
并返回变量的先前值,如使用getAcquire(java.lang.Object...)
的内存语义访问的那样。final Object
getAndSetRelease
(Object... args) 以原子方式将变量的值设置为具有setRelease(java.lang.Object...)
的内存语义的newValue
并返回变量的先前值,如使用get(java.lang.Object...)
的内存语义访问的那样。final Object
返回变量的值,按程序顺序访问,但不保证相对于其他线程的内存排序效果。final Object
getVolatile
(Object... args) 返回变量的值,具有读取的内存语义,就好像变量被声明为volatile
一样。boolean
如果此 VarHandle 具有 invoke-exact behavior ,则返回true
。final boolean
isAccessModeSupported
(VarHandle.AccessMode accessMode) 如果支持给定的访问模式,则返回true
,否则返回false
。static void
确保栅栏前的负载不会与栅栏后的负载重新排序。static void
确保栅栏之前的装载和存储不会与栅栏之后的存储重新排序。final void
将变量的值设置为newValue
,设置的内存语义就好像变量被声明为 non-volatile
和 non-final
一样。final void
按程序顺序将变量的值设置为newValue
,但不保证相对于其他线程的内存排序效果。final void
setRelease
(Object... args) 将变量的值设置为newValue
,并确保在此访问后不会重新排序之前的加载和存储。final void
setVolatile
(Object... args) 将变量的值设置为newValue
,设置的内存语义就好像变量被声明为volatile
一样。static void
确保围栏之前的商店不会与围栏之后的商店重新排序。toMethodHandle
(VarHandle.AccessMode accessMode) 获得绑定到此 VarHandle 和给定访问模式的方法句柄。final String
toString()
返回此 VarHandle 的紧凑文本描述,包括描述的变量类型及其坐标的描述。Class<?>
varType()
返回此 VarHandle 引用的变量的变量类型。final boolean
weakCompareAndSet
(Object... args) 如果变量的当前值(称为 witness value、==
和expectedValue
,使用getVolatile(java.lang.Object...)
的内存语义访问),可能会自动将变量的值设置为具有setVolatile(java.lang.Object...)
的内存语义的newValue
。final boolean
weakCompareAndSetAcquire
(Object... args) 如果变量的当前值(称为 witness value、==
和expectedValue
,使用getAcquire(java.lang.Object...)
的内存语义访问),则可能以原子方式将变量的值设置为具有set(java.lang.Object...)
语义的newValue
。final boolean
weakCompareAndSetPlain
(Object... args) 如果变量的当前值被称为 witness value、==
和expectedValue
,可以使用get(java.lang.Object...)
的内存语义访问,则可能原子地将变量的值设置为具有set(java.lang.Object...)
语义的newValue
。final boolean
weakCompareAndSetRelease
(Object... args) 如果变量的当前值(称为 witness value、==
和expectedValue
,使用get(java.lang.Object...)
的内存语义访问),可能会自动将变量的值设置为具有setRelease(java.lang.Object...)
语义的newValue
。abstract VarHandle
返回一个 VarHandle,可以访问与此 VarHandle 相同的变量,但其访问模式方法的调用行为已调整为 invoke behavior 。abstract VarHandle
返回一个 VarHandle,可以访问与此 VarHandle 相同的变量,但其访问模式方法的调用行为已调整为 invoke-exact behavior 。
-
方法详情
-
hasInvokeExactBehavior
public boolean hasInvokeExactBehavior()如果此 VarHandle 具有 invoke-exact behavior ,则返回true
。- 返回:
true
如果这个 VarHandle 有 invoke-exact behavior 。- 自从:
- 16
- 参见:
-
get
返回变量的值,具有读取的内存语义,就好像变量被声明为 non-volatile
一样。通常称为普通读取访问。方法签名的形式为
(CT1 ct1, ..., CTn ctn)T
。get
调用站点的符号类型描述符必须与在此 VarHandle 上调用accessModeType(VarHandle.AccessMode.GET)
结果的访问模式类型相匹配。所有 VarHandle 实例都支持此访问模式,并且永远不会抛出
UnsupportedOperationException
。- 参数:
args
- 形式为(CT1 ct1, ..., CTn)
的签名多态参数列表,使用可变参数静态表示。- 返回:
-
作为变量值的签名多态结果,使用
Object
静态表示。 - 抛出:
WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用转换失败。
-
set
将变量的值设置为newValue
,设置的内存语义就好像变量被声明为 non-volatile
和 non-final
一样。通常称为普通写访问。方法签名的形式为
(CT1 ct1, ..., CTn ctn, T newValue)void
set
调用站点的符号类型描述符必须与在此 VarHandle 上调用accessModeType(VarHandle.AccessMode.SET)
结果的访问模式类型相匹配。- 参数:
args
- 形式为(CT1 ct1, ..., CTn ctn, T newValue)
的签名多态参数列表,使用可变参数静态表示。- 抛出:
UnsupportedOperationException
- 如果此 VarHandle 不支持访问模式。WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用转换失败。
-
getVolatile
返回变量的值,具有读取的内存语义,就好像变量被声明为volatile
一样。方法签名的形式为
(CT1 ct1, ..., CTn ctn)T
。getVolatile
调用站点的符号类型描述符必须与在此 VarHandle 上调用accessModeType(VarHandle.AccessMode.GET_VOLATILE)
结果的访问模式类型相匹配。- 参数:
args
- 形式为(CT1 ct1, ..., CTn ctn)
的签名多态参数列表,使用可变参数静态表示。- 返回:
-
作为变量值的签名多态结果,使用
Object
静态表示。 - 抛出:
UnsupportedOperationException
- 如果此 VarHandle 不支持访问模式。WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用转换失败。
-
setVolatile
将变量的值设置为newValue
,设置的内存语义就好像变量被声明为volatile
一样。方法签名的形式为
(CT1 ct1, ..., CTn ctn, T newValue)void
。setVolatile
调用站点的符号类型描述符必须与在此 VarHandle 上调用accessModeType(VarHandle.AccessMode.SET_VOLATILE)
结果的访问模式类型相匹配。- API 注意:
-
忽略与 C 和 C++ 的许多语义差异,此方法具有与
memory_order_seq_cst
兼容的内存排序效果。 - 参数:
args
- 形式为(CT1 ct1, ..., CTn ctn, T newValue)
的签名多态参数列表,使用可变参数静态表示。- 抛出:
UnsupportedOperationException
- 如果此 VarHandle 不支持访问模式。WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用转换失败。
-
getOpaque
返回变量的值,按程序顺序访问,但不保证相对于其他线程的内存排序效果。方法签名的形式为
(CT1 ct1, ..., CTn ctn)T
。getOpaque
调用站点的符号类型描述符必须与在此 VarHandle 上调用accessModeType(VarHandle.AccessMode.GET_OPAQUE)
结果的访问模式类型相匹配。- 参数:
args
- 形式为(CT1 ct1, ..., CTn ctn)
的签名多态参数列表,使用可变参数静态表示。- 返回:
-
作为变量值的签名多态结果,使用
Object
静态表示。 - 抛出:
UnsupportedOperationException
- 如果此 VarHandle 不支持访问模式。WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用转换失败。
-
setOpaque
按程序顺序将变量的值设置为newValue
,但不保证相对于其他线程的内存排序效果。方法签名的形式为
(CT1 ct1, ..., CTn ctn, T newValue)void
。setOpaque
调用站点的符号类型描述符必须与在此 VarHandle 上调用accessModeType(VarHandle.AccessMode.SET_OPAQUE)
结果的访问模式类型相匹配。- 参数:
args
- 形式为(CT1 ct1, ..., CTn ctn, T newValue)
的签名多态参数列表,使用可变参数静态表示。- 抛出:
UnsupportedOperationException
- 如果此 VarHandle 不支持访问模式。WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用转换失败。
-
getAcquire
返回变量的值,并确保后续加载和存储在此访问之前不会重新排序。方法签名的形式为
(CT1 ct1, ..., CTn ctn)T
。getAcquire
调用站点的符号类型描述符必须与在此 VarHandle 上调用accessModeType(VarHandle.AccessMode.GET_ACQUIRE)
结果的访问模式类型相匹配。- API 注意:
-
忽略与 C 和 C++ 的许多语义差异,此方法具有与
memory_order_acquire
排序兼容的内存排序效果。 - 参数:
args
- 形式为(CT1 ct1, ..., CTn ctn)
的签名多态参数列表,使用可变参数静态表示。- 返回:
-
作为变量值的签名多态结果,使用
Object
静态表示。 - 抛出:
UnsupportedOperationException
- 如果此 VarHandle 不支持访问模式。WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用转换失败。
-
setRelease
将变量的值设置为newValue
,并确保在此访问后不会重新排序之前的加载和存储。方法签名的形式为
(CT1 ct1, ..., CTn ctn, T newValue)void
。setRelease
调用站点的符号类型描述符必须与在此 VarHandle 上调用accessModeType(VarHandle.AccessMode.SET_RELEASE)
结果的访问模式类型相匹配。- API 注意:
-
忽略与 C 和 C++ 的许多语义差异,此方法具有与
memory_order_release
排序兼容的内存排序效果。 - 参数:
args
- 形式为(CT1 ct1, ..., CTn ctn, T newValue)
的签名多态参数列表,使用可变参数静态表示。- 抛出:
UnsupportedOperationException
- 如果此 VarHandle 不支持访问模式。WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用转换失败。
-
compareAndSet
如果变量的当前值被称为 witness value、==
和expectedValue
,使用getVolatile(java.lang.Object...)
的内存语义访问,则以原子方式将变量的值设置为具有setVolatile(java.lang.Object...)
的内存语义的newValue
。方法签名的形式为
(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)
的签名多态参数列表,使用可变参数静态表示。- 返回:
true
如果成功,否则false
如果见证值与expectedValue
不同。- 抛出:
UnsupportedOperationException
- 如果此 VarHandle 不支持访问模式。WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用转换失败。- 参见:
-
compareAndExchange
如果变量的当前值被称为 witness value、==
和expectedValue
,使用getVolatile(java.lang.Object...)
的内存语义访问,则以原子方式将变量的值设置为具有setVolatile(java.lang.Object...)
的内存语义的newValue
。方法签名的形式为
(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)
的签名多态参数列表,使用可变参数静态表示。- 返回:
-
作为见证值的签名多态结果,如果成功,它将与
expectedValue
相同,使用Object
静态表示。 - 抛出:
UnsupportedOperationException
- 如果此 VarHandle 不支持访问模式。WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不兼容。ClassCastException
- 如果访问模式类型与调用者的符号类型描述符兼容,但引用转换失败。- 参见:
-
compareAndExchangeAcquire
如果变量的当前值被称为 witness value、==
和expectedValue
,使用getAcquire(java.lang.Object...)
的内存语义访问,则以原子方式将变量的值设置为具有set(java.lang.Object...)
的内存语义的newValue
。方法签名的形式为
(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)
的签名多态参数列表,使用可变参数静态表示。- 返回:
-
作为见证值的签名多态结果,如果成功,它将与
expectedValue
相同,使用Object
静态表示。 - 抛出:
UnsupportedOperationException
- 如果此 VarHandle 不支持访问模式。WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用转换失败。- 参见:
-
compareAndExchangeRelease
如果变量的当前值被称为 witness value、==
和expectedValue
,使用get(java.lang.Object...)
的内存语义访问,则以原子方式将变量的值设置为具有setRelease(java.lang.Object...)
的内存语义的newValue
。方法签名的形式为
(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)
的签名多态参数列表,使用可变参数静态表示。- 返回:
-
作为见证值的签名多态结果,如果成功,它将与
expectedValue
相同,使用Object
静态表示。 - 抛出:
UnsupportedOperationException
- 如果此 VarHandle 不支持访问模式。WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用转换失败。- 参见:
-
weakCompareAndSetPlain
如果变量的当前值被称为 witness value、==
和expectedValue
,可以使用get(java.lang.Object...)
的内存语义访问,则可能原子地将变量的值设置为具有set(java.lang.Object...)
语义的newValue
。即使见证值确实与预期值匹配,此操作也可能会虚假地失败(通常是由于内存争用)。
方法签名的形式为
(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)
的签名多态参数列表,使用可变参数静态表示。- 返回:
true
如果成功,否则false
如果 witness 值与expectedValue
不同或此操作虚假失败。- 抛出:
UnsupportedOperationException
- 如果此 VarHandle 不支持访问模式。WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用转换失败。- 参见:
-
weakCompareAndSet
如果变量的当前值(称为 witness value、==
和expectedValue
,使用getVolatile(java.lang.Object...)
的内存语义访问),可能会自动将变量的值设置为具有setVolatile(java.lang.Object...)
的内存语义的newValue
。即使见证值确实与预期值匹配,此操作也可能会虚假地失败(通常是由于内存争用)。
方法签名的形式为
(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)
的签名多态参数列表,使用可变参数静态表示。- 返回:
true
如果成功,否则false
如果 witness 值与expectedValue
不同或此操作虚假失败。- 抛出:
UnsupportedOperationException
- 如果此 VarHandle 不支持访问模式。WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用转换失败。- 参见:
-
weakCompareAndSetAcquire
如果变量的当前值(称为 witness value、==
和expectedValue
,使用getAcquire(java.lang.Object...)
的内存语义访问),则可能以原子方式将变量的值设置为具有set(java.lang.Object...)
语义的newValue
。即使见证值确实与预期值匹配,此操作也可能会虚假地失败(通常是由于内存争用)。
方法签名的形式为
(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)
的签名多态参数列表,使用可变参数静态表示。- 返回:
true
如果成功,否则false
如果 witness 值与expectedValue
不同或此操作虚假失败。- 抛出:
UnsupportedOperationException
- 如果此 VarHandle 不支持访问模式。WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用转换失败。- 参见:
-
weakCompareAndSetRelease
如果变量的当前值(称为 witness value、==
和expectedValue
,使用get(java.lang.Object...)
的内存语义访问),可能会自动将变量的值设置为具有setRelease(java.lang.Object...)
语义的newValue
。即使见证值确实与预期值匹配,此操作也可能会虚假地失败(通常是由于内存争用)。
方法签名的形式为
(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)
的签名多态参数列表,使用可变参数静态表示。- 返回:
true
如果成功,否则false
如果 witness 值与expectedValue
不同或此操作虚假失败。- 抛出:
UnsupportedOperationException
- 如果此 VarHandle 不支持访问模式。WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用转换失败。- 参见:
-
getAndSet
以原子方式将变量的值设置为具有setVolatile(java.lang.Object...)
的内存语义的newValue
并返回变量的先前值,如使用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)
的签名多态参数列表,使用可变参数静态表示。- 返回:
-
签名多态结果,即变量的先前值,使用
Object
静态表示。 - 抛出:
UnsupportedOperationException
- 如果此 VarHandle 不支持访问模式。WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用转换失败。- 参见:
-
getAndSetAcquire
以原子方式将变量的值设置为具有set(java.lang.Object...)
的内存语义的newValue
并返回变量的先前值,如使用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)
的签名多态参数列表,使用可变参数静态表示。- 返回:
-
签名多态结果,即变量的先前值,使用
Object
静态表示。 - 抛出:
UnsupportedOperationException
- 如果此 VarHandle 不支持访问模式。WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用转换失败。- 参见:
-
getAndSetRelease
以原子方式将变量的值设置为具有setRelease(java.lang.Object...)
的内存语义的newValue
并返回变量的先前值,如使用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)
的签名多态参数列表,使用可变参数静态表示。- 返回:
-
签名多态结果,即变量的先前值,使用
Object
静态表示。 - 抛出:
UnsupportedOperationException
- 如果此 VarHandle 不支持访问模式。WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用转换失败。- 参见:
-
getAndAdd
以原子方式将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)
的签名多态参数列表,使用可变参数静态表示。- 返回:
-
签名多态结果,即变量的先前值,使用
Object
静态表示。 - 抛出:
UnsupportedOperationException
- 如果此 VarHandle 不支持访问模式。WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用转换失败。- 参见:
-
getAndAddAcquire
以原子方式将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)
的签名多态参数列表,使用可变参数静态表示。- 返回:
-
签名多态结果,即变量的先前值,使用
Object
静态表示。 - 抛出:
UnsupportedOperationException
- 如果此 VarHandle 不支持访问模式。WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用转换失败。- 参见:
-
getAndAddRelease
以原子方式将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)
的签名多态参数列表,使用可变参数静态表示。- 返回:
-
签名多态结果,即变量的先前值,使用
Object
静态表示。 - 抛出:
UnsupportedOperationException
- 如果此 VarHandle 不支持访问模式。WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用转换失败。- 参见:
-
getAndBitwiseOr
原子地将变量的值设置为变量的当前值与具有setVolatile(java.lang.Object...)
的内存语义的mask
之间按位或的结果,并返回变量的先前值,如使用getVolatile(java.lang.Object...)
的内存语义访问的那样。如果变量类型是非整数
boolean
类型,则执行逻辑或而不是按位或。方法签名的形式为
(CT1 ct1, ..., CTn ctn, T mask)T
。getAndBitwiseOr
调用站点的符号类型描述符必须与在此 VarHandle 上调用accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_OR)
结果的访问模式类型相匹配。- 参数:
args
- 形式为(CT1 ct1, ..., CTn ctn, T mask)
的签名多态参数列表,使用可变参数静态表示。- 返回:
-
签名多态结果,即变量的先前值,使用
Object
静态表示。 - 抛出:
UnsupportedOperationException
- 如果此 VarHandle 不支持访问模式。WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用转换失败。- 参见:
-
getAndBitwiseOrAcquire
原子地将变量的值设置为变量的当前值与具有set(java.lang.Object...)
的内存语义的mask
之间的按位或的结果,并返回变量的先前值,如使用getAcquire(java.lang.Object...)
的内存语义访问的那样。如果变量类型是非整数
boolean
类型,则执行逻辑或而不是按位或。方法签名的形式为
(CT1 ct1, ..., CTn ctn, T mask)T
。getAndBitwiseOrAcquire
调用站点的符号类型描述符必须与在此 VarHandle 上调用accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_OR_ACQUIRE)
结果的访问模式类型相匹配。- 参数:
args
- 形式为(CT1 ct1, ..., CTn ctn, T mask)
的签名多态参数列表,使用可变参数静态表示。- 返回:
-
签名多态结果,即变量的先前值,使用
Object
静态表示。 - 抛出:
UnsupportedOperationException
- 如果此 VarHandle 不支持访问模式。WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用转换失败。- 参见:
-
getAndBitwiseOrRelease
以原子方式将变量的值设置为变量的当前值与具有setRelease(java.lang.Object...)
的内存语义的mask
之间按位或的结果,并返回变量的先前值,如使用get(java.lang.Object...)
的内存语义访问的那样。如果变量类型是非整数
boolean
类型,则执行逻辑或而不是按位或。方法签名的形式为
(CT1 ct1, ..., CTn ctn, T mask)T
。getAndBitwiseOrRelease
调用站点的符号类型描述符必须与在此 VarHandle 上调用accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_OR_RELEASE)
结果的访问模式类型相匹配。- 参数:
args
- 形式为(CT1 ct1, ..., CTn ctn, T mask)
的签名多态参数列表,使用可变参数静态表示。- 返回:
-
签名多态结果,即变量的先前值,使用
Object
静态表示。 - 抛出:
UnsupportedOperationException
- 如果此 VarHandle 不支持访问模式。WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用转换失败。- 参见:
-
getAndBitwiseAnd
原子地将变量的值设置为变量的当前值与具有setVolatile(java.lang.Object...)
的内存语义的mask
之间的按位与的结果,并返回变量的先前值,如使用getVolatile(java.lang.Object...)
的内存语义访问的那样。如果变量类型是非整数
boolean
类型,则执行逻辑与而不是按位与。方法签名的形式为
(CT1 ct1, ..., CTn ctn, T mask)T
。getAndBitwiseAnd
调用站点的符号类型描述符必须与在此 VarHandle 上调用accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_AND)
结果的访问模式类型相匹配。- 参数:
args
- 形式为(CT1 ct1, ..., CTn ctn, T mask)
的签名多态参数列表,使用可变参数静态表示。- 返回:
-
签名多态结果,即变量的先前值,使用
Object
静态表示。 - 抛出:
UnsupportedOperationException
- 如果此 VarHandle 不支持访问模式。WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用转换失败。- 参见:
-
getAndBitwiseAndAcquire
原子地将变量的值设置为变量的当前值与具有set(java.lang.Object...)
的内存语义的mask
之间的按位与的结果,并返回变量的先前值,如使用getAcquire(java.lang.Object...)
的内存语义访问的那样。如果变量类型是非整数
boolean
类型,则执行逻辑与而不是按位与。方法签名的形式为
(CT1 ct1, ..., CTn ctn, T mask)T
。getAndBitwiseAndAcquire
调用站点的符号类型描述符必须与在此 VarHandle 上调用accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_AND_ACQUIRE)
结果的访问模式类型相匹配。- 参数:
args
- 形式为(CT1 ct1, ..., CTn ctn, T mask)
的签名多态参数列表,使用可变参数静态表示。- 返回:
-
签名多态结果,即变量的先前值,使用
Object
静态表示。 - 抛出:
UnsupportedOperationException
- 如果此 VarHandle 不支持访问模式。WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用转换失败。- 参见:
-
getAndBitwiseAndRelease
以原子方式将变量的值设置为变量的当前值与具有setRelease(java.lang.Object...)
的内存语义的mask
之间的按位与的结果,并返回变量的先前值,如使用get(java.lang.Object...)
的内存语义访问的那样。如果变量类型是非整数
boolean
类型,则执行逻辑与而不是按位与。方法签名的形式为
(CT1 ct1, ..., CTn ctn, T mask)T
。getAndBitwiseAndRelease
调用站点的符号类型描述符必须与在此 VarHandle 上调用accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_AND_RELEASE)
结果的访问模式类型相匹配。- 参数:
args
- 形式为(CT1 ct1, ..., CTn ctn, T mask)
的签名多态参数列表,使用可变参数静态表示。- 返回:
-
签名多态结果,即变量的先前值,使用
Object
静态表示。 - 抛出:
UnsupportedOperationException
- 如果此 VarHandle 不支持访问模式。WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用转换失败。- 参见:
-
getAndBitwiseXor
以原子方式将变量的值设置为变量的当前值与具有setVolatile(java.lang.Object...)
的内存语义的mask
之间按位异或的结果,并返回变量的先前值,如使用getVolatile(java.lang.Object...)
的内存语义访问的那样。如果变量类型是非整数
boolean
类型,则执行逻辑 XOR 而不是按位 XOR。方法签名的形式为
(CT1 ct1, ..., CTn ctn, T mask)T
。getAndBitwiseXor
调用站点的符号类型描述符必须与在此 VarHandle 上调用accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_XOR)
结果的访问模式类型相匹配。- 参数:
args
- 形式为(CT1 ct1, ..., CTn ctn, T mask)
的签名多态参数列表,使用可变参数静态表示。- 返回:
-
签名多态结果,即变量的先前值,使用
Object
静态表示。 - 抛出:
UnsupportedOperationException
- 如果此 VarHandle 不支持访问模式。WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用转换失败。- 参见:
-
getAndBitwiseXorAcquire
以原子方式将变量的值设置为变量的当前值与具有set(java.lang.Object...)
的内存语义的mask
之间按位异或的结果,并返回变量的先前值,如使用getAcquire(java.lang.Object...)
的内存语义访问的那样。如果变量类型是非整数
boolean
类型,则执行逻辑 XOR 而不是按位 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)
的签名多态参数列表,使用可变参数静态表示。- 返回:
-
签名多态结果,即变量的先前值,使用
Object
静态表示。 - 抛出:
UnsupportedOperationException
- 如果此 VarHandle 不支持访问模式。WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用转换失败。- 参见:
-
getAndBitwiseXorRelease
以原子方式将变量的值设置为变量的当前值与具有setRelease(java.lang.Object...)
的内存语义的mask
之间按位异或的结果,并返回变量的先前值,如使用get(java.lang.Object...)
的内存语义访问的那样。如果变量类型是非整数
boolean
类型,则执行逻辑 XOR 而不是按位 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)
的签名多态参数列表,使用可变参数静态表示。- 返回:
-
签名多态结果,即变量的先前值,使用
Object
静态表示。 - 抛出:
UnsupportedOperationException
- 如果此 VarHandle 不支持访问模式。WrongMethodTypeException
- 如果访问模式类型与调用者的符号类型描述符不匹配。ClassCastException
- 如果访问模式类型与调用者的符号类型描述符匹配,但引用转换失败。- 参见:
-
withInvokeExactBehavior
返回一个 VarHandle,可以访问与此 VarHandle 相同的变量,但其访问模式方法的调用行为已调整为 invoke-exact behavior 。如果此 VarHandle 已经具有调用精确行为,则返回此 VarHandle。
在返回的 var 句柄上调用
hasInvokeExactBehavior()
保证返回true
。- API 注意:
-
Invoke-exact 行为保证在调用访问模式方法时,参数的类型和参数必须与
access mode type
匹配,否则将抛出WrongMethodTypeException
。 - 返回:
- 具有调用精确行为的 VarHandle
- 自从:
- 16
- 参见:
-
withInvokeBehavior
返回一个 VarHandle,可以访问与此 VarHandle 相同的变量,但其访问模式方法的调用行为已调整为 invoke behavior 。如果此 VarHandle 已经具有调用行为,则返回此 VarHandle。
在返回的 var 句柄上调用
hasInvokeExactBehavior()
保证返回false
。- 返回:
- 具有调用行为的 VarHandle
- 自从:
- 16
- 参见:
-
toString
返回此 VarHandle 的紧凑文本描述,包括描述的变量类型及其坐标的描述。 -
varType
返回此 VarHandle 引用的变量的变量类型。- 返回:
- 此 VarHandle 引用的变量的变量类型
-
coordinateTypes
返回此 VarHandle 的坐标类型。- 返回:
- 此 VarHandle 的坐标类型。返回列表不可修改
-
accessModeType
获取此 VarHandle 的访问模式类型和给定的访问模式。访问模式类型的参数类型将包含一个前缀,该前缀是此 VarHandle 的坐标类型,后跟访问模式方法定义的其他类型。访问模式类型的返回类型由访问模式方法的返回类型定义。
- 参数:
accessMode
- 访问模式,对应同名的签名多态方法- 返回:
- 给定访问模式的访问模式类型
-
isAccessModeSupported
如果支持给定的访问模式,则返回true
,否则返回false
。给定访问模式返回
false
值表示在调用相应的访问模式方法时抛出UnsupportedOperationException
。- 参数:
accessMode
- 访问模式,对应同名的签名多态方法- 返回:
true
如果支持给定的访问模式,否则false
。
-
toMethodHandle
获得绑定到此 VarHandle 和给定访问模式的方法句柄。- API 注意:
-
此方法对于 VarHandle
vh
和访问模式{access-mode}
返回一个方法句柄,该句柄等效于以下代码中的方法句柄bmh
(尽管它可能更有效):MethodHandle mh = MethodHandles.varHandleExactInvoker( vh.accessModeType(VarHandle.AccessMode.{access-mode})); MethodHandle bmh = mh.bindTo(vh);
- 参数:
accessMode
- 访问模式,对应同名的签名多态方法- 返回:
- 绑定到此 VarHandle 和给定访问模式的方法句柄
-
describeConstable
如果可以构造,则返回此实例的标称描述符,如果不能构造,则返回一个空的Optional
。- 指定者:
describeConstable
在接口Constable
中- 返回:
-
包含生成的标称描述符的
Optional
,或者如果无法构造则为空的Optional
。 - 自从:
- 12
-
fullFence
public static void fullFence()确保栅栏之前的装载和存储不会与栅栏之后的装载和存储重新排序。- API 注意:
-
忽略与 C 和 C++ 的许多语义差异,此方法具有与
atomic_thread_fence(memory_order_seq_cst)
兼容的内存排序效果
-
acquireFence
public static void acquireFence()确保栅栏前的负载不会与栅栏后的负载和存储重新排序。- API 注意:
-
忽略与 C 和 C++ 的许多语义差异,此方法具有与
atomic_thread_fence(memory_order_acquire)
兼容的内存排序效果
-
releaseFence
public static void releaseFence()确保栅栏之前的装载和存储不会与栅栏之后的存储重新排序。- API 注意:
-
忽略与 C 和 C++ 的许多语义差异,此方法具有与
atomic_thread_fence(memory_order_release)
兼容的内存排序效果
-
loadLoadFence
public static void loadLoadFence()确保栅栏前的负载不会与栅栏后的负载重新排序。 -
storeStoreFence
public static void storeStoreFence()确保围栏之前的商店不会与围栏之后的商店重新排序。
-