模块  java.base
软件包  java.lang.invoke

Class VarHandle


  • public abstract class VarHandle
    extends 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操作都是相互完全排序的。

    访问模式分为以下几类:

    生成的工厂方法或lookup VarHandle实例记录了所支持的访问模式集,其中还可能包括基于变量类型的文档限制以及变量是否为只读。 如果不支持访问模式,那么相应的访问模式方法将在调用时抛出UnsupportedOperationException 工厂方法应记录访问模式方法可能引发的任何其他未声明的异常。 所有VarHandle实例都支持get访问模式,相应的方法永远不会抛出UnsupportedOperationException 如果VarHandle引用只读变量(例如final字段),则不支持写入,原子更新,数字原子更新和按位原子更新访问模式,并且相应的方法抛出UnsupportedOperationException 读/写访问模式(如果支持), getset ,为引用类型和所有基元类型提供原子访问。 除非在工厂方法的文档中另有说明,否则访问模式getset (如果支持)为参考类型和所有基元类型提供原子访问,但32位平台上的longdouble除外。

    访问模式将覆盖变量声明站点上指定的任何内存排序效果。 例如,使用get访问模式访问字段的get将访问由其访问模式指定的字段,即使该字段声明为volatile 当执行混合访问时,应特别小心,因为Java内存模型可能会产生令人惊讶的结果。

    除了支持在各种访问模式下访问变量之外,还提供了一组静态方法,称为内存栅栏方法,用于细粒度控制内存排序。 Java语言规范允许其他线程观察操作,就像它们以不同于程序源代码中明显的顺序执行,受到例如使用锁, volatile字段或VarHandles的限制。 静态方法, fullFenceacquireFencereleaseFenceloadLoadFencestoreStoreFence ,也可以用来施加约束。 与某些访问模式的情况一样,它们的规范是根据缺乏“重新排序”来表达的 - 如果不存在围栏,则可能出现可观察到的排序效应。 访问模式方法和存储器范围方法的规范的更精确的措辞可以伴随Java语言规范的未来更新。

    编译访问模式方法的调用

    命名访问模式方法的Java方法调用表达式可以从Java源代码调用VarHandle。 从源代码的角度来看,这些方法可以接受任何参数,并且它们的多态结果(如果表达的话)可以转换为任何返回类型。 正式地,这是通过给出访问模式方法变量arity Object参数和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实例。

    调用检查

    在典型的程序中,VarHandle访问模式类型匹配通常会成功。 但如果匹配失败,JVM将抛出WrongMethodTypeException

    因此,接入模式类型不匹配可能显示为在一个静态类型节目联动误差最多可以显示作为动态WrongMethodTypeException在使用VarHandles的程序。

    由于访问模式类型包含“实时” 对象,因此方法类型匹配会同时考虑类型名称和类加载器。 因此,即使VarHandle VH在一个类加载器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将准确报告任何类似声明的方法所需的那些修饰符位,包括nativevarargs位。

    与任何反射方法一样,这些方法(反映时)可以通过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
    另请参见:
    MethodHandleMethodHandlesMethodType
    • 方法详细信息

      • 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...)
      • 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()
        确保栅栏前的商店不会在栅栏后与商店重新订购。