jdk/src/java.base/share/classes/java/lang/invoke/VarHandle.java
author psandoz
Wed, 13 Apr 2016 15:05:48 +0200
changeset 37343 35a2231828a7
parent 36973 951bb58383a4
child 37344 52d3d8517efc
permissions -rw-r--r--
8151705: VarHandle.AccessMode enum names should conform to code style Reviewed-by: mhaupt, shade, redestad
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
     1
/*
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
     2
 * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
     4
 *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    10
 *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    15
 * accompanied this code).
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    16
 *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    20
 *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    23
 * questions.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    24
 */
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    25
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    26
package java.lang.invoke;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    27
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    28
import jdk.internal.HotSpotIntrinsicCandidate;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    29
import jdk.internal.vm.annotation.ForceInline;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    30
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    31
import java.lang.reflect.Method;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    32
import java.util.ArrayList;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    33
import java.util.Arrays;
37343
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
    34
import java.util.HashMap;
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    35
import java.util.List;
37343
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
    36
import java.util.Map;
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    37
import java.util.function.BiFunction;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    38
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    39
import static java.lang.invoke.MethodHandleStatics.UNSAFE;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    40
import static java.lang.invoke.MethodHandleStatics.newInternalError;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    41
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    42
/**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    43
 * A VarHandle is a dynamically typed reference to a variable, or to a
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    44
 * parametrically-defined family of variables, including static fields,
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    45
 * non-static fields, array elements, or components of an off-heap data
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    46
 * structure.  Access to such variables is supported under various
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    47
 * <em>access modes</em>, including plain read/write access, volatile
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    48
 * read/write access, and compare-and-swap.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    49
 *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    50
 * <p>VarHandles are immutable and have no visible state.  VarHandles cannot be
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    51
 * subclassed by the user.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    52
 *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    53
 * <p>A VarHandle has:
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    54
 * <ul>
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    55
 * <li>a {@link #varType variable type}, referred to as {@code T}, which is the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    56
 * type of variable(s) referenced by this VarHandle;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    57
 * <li>a list of {@link #coordinateTypes coordinate types}, referred to as
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    58
 * {@code CT}, where the types (primitive and reference) are represented by
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    59
 * {@link Class} objects).  A list of arguments corresponding to instances of
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    60
 * the coordinate types uniquely locates a variable referenced by this
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    61
 * VarHandle; and
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    62
 * <li>a <em>shape</em>, that combines the variable type and coordinate types,
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    63
 * and is declared with the notation {@code (CT : T)}.  An empty list of
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    64
 * coordinate types is declared as {@code (empty)}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    65
 * </ul>
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    66
 *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    67
 * <p>Factory methods that produce or {@link java.lang.invoke.MethodHandles.Lookup
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    68
 * lookup} VarHandle instances document the supported variable type, coordinate
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    69
 * types, and shape.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    70
 *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    71
 * For example, a VarHandle referencing a non-static field will declare a shape
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    72
 * of {@code (R : T)}, where {@code R} is the receiver type and
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    73
 * {@code T} is the field type, and where the VarHandle and an instance of the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    74
 * receiver type can be utilized to access the field variable.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    75
 * A VarHandle referencing array elements will declare a shape of
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    76
 * {@code (T[], int : T)}, where {@code T[]} is the array type and {@code T}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    77
 * its component type, and where the VarHandle, an instance of the array type,
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    78
 * and an {@code int} index can be utilized to access an array element variable.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    79
 *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    80
 * <p>Each access mode is associated with a
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    81
 * <a href="MethodHandle.html#sigpoly">signature polymorphic</a> method of the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    82
 * same name, where the VarHandle shape and access mode uniquely determine the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    83
 * canonical {@link #accessModeType(AccessMode) access mode type},
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    84
 * which in turn determines the matching constraints on a valid symbolic
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    85
 * type descriptor at the call site of an access mode's method
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    86
 * <a href="VarHandle.html#invoke">invocation</a>.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    87
 *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    88
 * As such, VarHandles are dynamically and strongly typed.  Their arity,
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    89
 * argument types, and return type of an access mode method invocation are not
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    90
 * statically checked.  If they, and associated values, do not match the arity
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    91
 * and types of the access mode's type, an exception will be thrown.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    92
 *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    93
 * The parameter types of an access mode method type will consist of those that
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    94
 * are the VarHandles's coordinate types (in order), followed by access mode
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    95
 * parameter types specific to the access mode.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    96
 *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    97
 * <p>An access mode's method documents the form of its method signature, which
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    98
 * is derived from the access mode parameter types.  The form is declared with
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
    99
 * the notation {@code (CT, P1 p1, P2 p2, ..., PN pn)R}, where {@code CT} is the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   100
 * coordinate types (as documented by a VarHandle factory method), {@code P1},
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   101
 * {@code P2} and {@code PN} are the first, second and the n'th access mode
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   102
 * parameters named {@code p1}, {@code p2} and {@code pn} respectively, and
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   103
 * {@code R} is the return type.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   104
 *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   105
 * For example, for the generic shape of {@code (CT : T)} the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   106
 * {@link #compareAndSet} access mode method documents that its method
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   107
 * signature is of the form {@code (CT, T expectedValue, T newValue)boolean},
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   108
 * where the parameter types named {@code extendedValue} and {@code newValue}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   109
 * are the access mode parameter types.  If the VarHandle accesses array
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   110
 * elements with a shape of say {@code (T[], int : T)} then the access mode
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   111
 * method type is {@code (T[], int, T, T)boolean}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   112
 *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   113
 * <p>Access modes are grouped into the following categories:
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   114
 * <ul>
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   115
 * <li>read access modes that get the value of a variable under specified
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   116
 * memory ordering effects.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   117
 * The set of corresponding access mode methods belonging to this group
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   118
 * consists of the methods
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   119
 * {@link #get get},
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   120
 * {@link #getVolatile getVolatile},
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   121
 * {@link #getAcquire getAcquire},
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   122
 * {@link #getOpaque getOpaque}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   123
 * <li>write access modes that set the value of a variable under specified
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   124
 * memory ordering effects.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   125
 * The set of corresponding access mode methods belonging to this group
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   126
 * consists of the methods
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   127
 * {@link #set set},
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   128
 * {@link #setVolatile setVolatile},
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   129
 * {@link #setRelease setRelease},
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   130
 * {@link #setOpaque setOpaque}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   131
 * <li>atomic update access modes that, for example, atomically compare and set
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   132
 * the value of a variable under specified memory ordering effects.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   133
 * The set of corresponding access mode methods belonging to this group
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   134
 * consists of the methods
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   135
 * {@link #compareAndSet compareAndSet},
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   136
 * {@link #weakCompareAndSet weakCompareAndSet},
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   137
 * {@link #weakCompareAndSetAcquire weakCompareAndSetAcquire},
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   138
 * {@link #weakCompareAndSetRelease weakCompareAndSetRelease},
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   139
 * {@link #compareAndExchangeAcquire compareAndExchangeAcquire},
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   140
 * {@link #compareAndExchangeVolatile compareAndExchangeVolatile},
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   141
 * {@link #compareAndExchangeRelease compareAndExchangeRelease},
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   142
 * {@link #getAndSet getAndSet}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   143
 * <li>numeric atomic update access modes that, for example, atomically get and
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   144
 * set with addition the value of a variable under specified memory ordering
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   145
 * effects.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   146
 * The set of corresponding access mode methods belonging to this group
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   147
 * consists of the methods
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   148
 * {@link #getAndAdd getAndAdd},
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   149
 * {@link #addAndGet addAndGet}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   150
 * </ul>
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   151
 *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   152
 * <p>Factory methods that produce or {@link java.lang.invoke.MethodHandles.Lookup
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   153
 * lookup} VarHandle instances document the set of access modes that are
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   154
 * supported, which may also include documenting restrictions based on the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   155
 * variable type and whether a variable is read-only.  If an access mode is not
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   156
 * supported then the corresponding signature-polymorphic method will on
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   157
 * invocation throw an {@code UnsupportedOperationException}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   158
 * The {@link #get get} access mode is supported for all
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   159
 * VarHandle instances and the corresponding method never throws
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   160
 * {@code UnsupportedOperationException}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   161
 * If a VarHandle references a read-only variable (for example a {@code final}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   162
 * field) then write, atomic update and numeric atomic update access modes are
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   163
 * not supported and corresponding methods throw
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   164
 * {@code UnsupportedOperationException}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   165
 * Read/write access modes (if supported), with the exception of
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   166
 * {@code get} and {@code set}, provide atomic access for
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   167
 * reference types and all primitive types.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   168
 * Unless stated otherwise in the documentation of a factory method, the access
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   169
 * modes {@code get} and {@code set} (if supported) provide atomic access for
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   170
 * reference types and all primitives types, with the exception of {@code long}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   171
 * and {@code double} on 32-bit platforms
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   172
 *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   173
 * <p>Access modes will override any memory ordering effects specified at
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   174
 * the declaration site of a variable.  For example, a VarHandle accessing a
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   175
 * a field using the {@code get} access mode will access the field as
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   176
 * specified <em>by its access mode</em> even if that field is declared
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   177
 * {@code volatile}.  When mixed access is performed extreme care should be
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   178
 * taken since the Java Memory Model may permit surprising results.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   179
 *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   180
 * <p>In addition to supporting access to variables under various access modes,
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   181
 * a set of static methods, referred to as memory fence methods, is also
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   182
 * provided for fine-grained control of memory ordering.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   183
 *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   184
 * The Java Language Specification permits other threads to observe operations
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   185
 * as if they were executed in orders different than are apparent in program
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   186
 * source code, subject to constraints arising, for example, from the use of
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   187
 * locks, {@code volatile} fields or VarHandles.  The static methods,
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   188
 * {@link #fullFence fullFence}, {@link #acquireFence acquireFence},
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   189
 * {@link #releaseFence releaseFence}, {@link #loadLoadFence loadLoadFence} and
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   190
 * {@link #storeStoreFence storeStoreFence}, can also be used to impose
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   191
 * constraints.  Their specifications, as is the case for certain access modes,
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   192
 * are phrased in terms of the lack of "reorderings" -- observable ordering
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   193
 * effects that might otherwise occur if the fence was not present.  More
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   194
 * precise phrasing of the specification of access mode methods and memory fence
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   195
 * methods may accompany future updates of the Java Language Specification.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   196
 *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   197
 * <h1>Compilation of an access mode's method</h1>
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   198
 * A Java method call expression naming an access mode method can invoke a
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   199
 * VarHandle from Java source code.  From the viewpoint of source code, these
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   200
 * methods can take any arguments and their polymorphic result (if expressed)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   201
 * can be cast to any return type.  Formally this is accomplished by giving the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   202
 * access mode methods variable arity {@code Object} arguments and
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   203
 * {@code Object} return types (if the return type is polymorphic), but they
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   204
 * have an additional quality called <em>signature polymorphism</em> which
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   205
 * connects this freedom of invocation directly to the JVM execution stack.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   206
 * <p>
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   207
 * As is usual with virtual methods, source-level calls to access mode methods
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   208
 * compile to an {@code invokevirtual} instruction.  More unusually, the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   209
 * compiler must record the actual argument types, and may not perform method
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   210
 * invocation conversions on the arguments.  Instead, it must generate
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   211
 * instructions to push them on the stack according to their own unconverted
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   212
 * types.  The VarHandle object itself will be pushed on the stack before the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   213
 * arguments.  The compiler then generates an {@code invokevirtual} instruction
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   214
 * that invokes the access mode method with a symbolic type descriptor which
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   215
 * describes the argument and return types.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   216
 * <p>
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   217
 * To issue a complete symbolic type descriptor, the compiler must also
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   218
 * determine the return type (if polymorphic).  This is based on a cast on the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   219
 * method invocation expression, if there is one, or else {@code Object} if the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   220
 * invocation is an expression, or else {@code void} if the invocation is a
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   221
 * statement.  The cast may be to a primitive type (but not {@code void}).
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   222
 * <p>
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   223
 * As a corner case, an uncasted {@code null} argument is given a symbolic type
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   224
 * descriptor of {@code java.lang.Void}.  The ambiguity with the type
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   225
 * {@code Void} is harmless, since there are no references of type {@code Void}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   226
 * except the null reference.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   227
 *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   228
 *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   229
 * <h1><a name="invoke">Invocation of an access mode's method</a></h1>
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   230
 * The first time an {@code invokevirtual} instruction is executed it is linked
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   231
 * by symbolically resolving the names in the instruction and verifying that
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   232
 * the method call is statically legal.  This also holds for calls to access mode
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   233
 * methods.  In this case, the symbolic type descriptor emitted by the compiler
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   234
 * is checked for correct syntax, and names it contains are resolved.  Thus, an
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   235
 * {@code invokevirtual} instruction which invokes an access mode method will
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   236
 * always link, as long as the symbolic type descriptor is syntactically
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   237
 * well-formed and the types exist.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   238
 * <p>
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   239
 * When the {@code invokevirtual} is executed after linking, the receiving
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   240
 * VarHandle's access mode type is first checked by the JVM to ensure that it
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   241
 * matches the symbolic type descriptor.  If the type
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   242
 * match fails, it means that the access mode method which the caller is
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   243
 * invoking is not present on the individual VarHandle being invoked.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   244
 *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   245
 * <p>
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   246
 * Invocation of an access mode's signature-polymorphic method behaves as if an
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   247
 * invocation of {@link MethodHandle#invoke}, where the receiving method handle
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   248
 * is bound to a VarHandle instance and the access mode.  More specifically, the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   249
 * following:
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   250
 * <pre> {@code
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   251
 * VarHandle vh = ..
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   252
 * R r = (R) vh.{access-mode}(p1, p2, ..., pN);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   253
 * }</pre>
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   254
 * behaves as if (modulo the access mode methods do not declare throwing of
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   255
 * {@code Throwable}):
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   256
 * <pre> {@code
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   257
 * VarHandle vh = ..
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   258
 * MethodHandle mh = MethodHandles.varHandleExactInvoker(
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   259
 *                       VarHandle.AccessMode.{access-mode},
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   260
 *                       vh.accessModeType(VarHandle.AccessMode.{access-mode}));
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   261
 *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   262
 * mh = mh.bindTo(vh);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   263
 * R r = (R) mh.invoke(p1, p2, ..., pN)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   264
 * }</pre>
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   265
 * or, more concisely, behaves as if:
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   266
 * <pre> {@code
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   267
 * VarHandle vh = ..
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   268
 * MethodHandle mh = vh.toMethodHandle(VarHandle.AccessMode.{access-mode});
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   269
 *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   270
 * R r = (R) mh.invoke(p1, p2, ..., pN)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   271
 * }</pre>
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   272
 * In terms of equivalent {@code invokevirtual} bytecode behaviour an access
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   273
 * mode method invocation is equivalent to:
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   274
 * <pre> {@code
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   275
 * MethodHandle mh = MethodHandles.lookup().findVirtual(
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   276
 *                       VarHandle.class,
37343
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
   277
 *                       VarHandle.AccessMode.{access-mode}.methodName(),
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   278
 *                       MethodType.methodType(R, p1, p2, ..., pN));
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   279
 *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   280
 * R r = (R) mh.invokeExact(vh, p1, p2, ..., pN)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   281
 * }</pre>
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   282
 * where the desired method type is the symbolic type descriptor and a
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   283
 * {@link MethodHandle#invokeExact} is performed, since before invocation of the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   284
 * target, the handle will apply reference casts as necessary and box, unbox, or
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   285
 * widen primitive values, as if by {@link MethodHandle#asType asType} (see also
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   286
 * {@link MethodHandles#varHandleInvoker}).
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   287
 *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   288
 * <h1>Invocation checking</h1>
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   289
 * In typical programs, VarHandle access mode type matching will usually
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   290
 * succeed.  But if a match fails, the JVM will throw a
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   291
 * {@link WrongMethodTypeException}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   292
 * <p>
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   293
 * Thus, an access mode type mismatch which might show up as a linkage error
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   294
 * in a statically typed program can show up as a dynamic
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   295
 * {@code WrongMethodTypeException} in a program which uses VarHandles.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   296
 * <p>
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   297
 * Because access mode types contain "live" {@code Class} objects, method type
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   298
 * matching takes into account both type names and class loaders.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   299
 * Thus, even if a VarHandle {@code VH} is created in one class loader
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   300
 * {@code L1} and used in another {@code L2}, VarHandle access mode method
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   301
 * calls are type-safe, because the caller's symbolic type descriptor, as
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   302
 * resolved in {@code L2}, is matched against the original callee method's
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   303
 * symbolic type descriptor, as resolved in {@code L1}.  The resolution in
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   304
 * {@code L1} happens when {@code VH} is created and its access mode types are
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   305
 * assigned, while the resolution in {@code L2} happens when the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   306
 * {@code invokevirtual} instruction is linked.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   307
 * <p>
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   308
 * Apart from type descriptor checks, a VarHandles's capability to
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   309
 * access it's variables is unrestricted.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   310
 * If a VarHandle is formed on a non-public variable by a class that has access
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   311
 * to that variable, the resulting VarHandle can be used in any place by any
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   312
 * caller who receives a reference to it.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   313
 * <p>
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   314
 * Unlike with the Core Reflection API, where access is checked every time a
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   315
 * reflective method is invoked, VarHandle access checking is performed
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   316
 * <a href="MethodHandles.Lookup.html#access">when the VarHandle is
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   317
 * created</a>.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   318
 * Thus, VarHandles to non-public variables, or to variables in non-public
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   319
 * classes, should generally be kept secret.  They should not be passed to
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   320
 * untrusted code unless their use from the untrusted code would be harmless.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   321
 *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   322
 *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   323
 * <h1>VarHandle creation</h1>
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   324
 * Java code can create a VarHandle that directly accesses any field that is
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   325
 * accessible to that code.  This is done via a reflective, capability-based
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   326
 * API called {@link java.lang.invoke.MethodHandles.Lookup
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   327
 * MethodHandles.Lookup}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   328
 * For example, a VarHandle for a non-static field can be obtained
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   329
 * from {@link java.lang.invoke.MethodHandles.Lookup#findVarHandle
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   330
 * Lookup.findVarHandle}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   331
 * There is also a conversion method from Core Reflection API objects,
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   332
 * {@link java.lang.invoke.MethodHandles.Lookup#unreflectVarHandle
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   333
 * Lookup.unreflectVarHandle}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   334
 * <p>
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   335
 * Access to protected field members is restricted to receivers only of the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   336
 * accessing class, or one of its subclasses, and the accessing class must in
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   337
 * turn be a subclass (or package sibling) of the protected member's defining
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   338
 * class.  If a VarHandle refers to a protected non-static field of a declaring
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   339
 * class outside the current package, the receiver argument will be narrowed to
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   340
 * the type of the accessing class.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   341
 *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   342
 * <h1>Interoperation between VarHandles and the Core Reflection API</h1>
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   343
 * Using factory methods in the {@link java.lang.invoke.MethodHandles.Lookup
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   344
 * Lookup} API, any field represented by a Core Reflection API object
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   345
 * can be converted to a behaviorally equivalent VarHandle.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   346
 * For example, a reflective {@link java.lang.reflect.Field Field} can
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   347
 * be converted to a VarHandle using
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   348
 * {@link java.lang.invoke.MethodHandles.Lookup#unreflectVarHandle
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   349
 * Lookup.unreflectVarHandle}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   350
 * The resulting VarHandles generally provide more direct and efficient
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   351
 * access to the underlying fields.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   352
 * <p>
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   353
 * As a special case, when the Core Reflection API is used to view the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   354
 * signature polymorphic access mode methods in this class, they appear as
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   355
 * ordinary non-polymorphic methods.  Their reflective appearance, as viewed by
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   356
 * {@link java.lang.Class#getDeclaredMethod Class.getDeclaredMethod},
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   357
 * is unaffected by their special status in this API.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   358
 * For example, {@link java.lang.reflect.Method#getModifiers
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   359
 * Method.getModifiers}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   360
 * will report exactly those modifier bits required for any similarly
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   361
 * declared method, including in this case {@code native} and {@code varargs}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   362
 * bits.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   363
 * <p>
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   364
 * As with any reflected method, these methods (when reflected) may be invoked
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   365
 * directly via {@link java.lang.reflect.Method#invoke java.lang.reflect.Method.invoke},
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   366
 * via JNI, or indirectly via
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   367
 * {@link java.lang.invoke.MethodHandles.Lookup#unreflect Lookup.unreflect}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   368
 * However, such reflective calls do not result in access mode method
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   369
 * invocations.  Such a call, if passed the required argument (a single one, of
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   370
 * type {@code Object[]}), will ignore the argument and will throw an
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   371
 * {@code UnsupportedOperationException}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   372
 * <p>
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   373
 * Since {@code invokevirtual} instructions can natively invoke VarHandle
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   374
 * access mode methods under any symbolic type descriptor, this reflective view
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   375
 * conflicts with the normal presentation of these methods via bytecodes.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   376
 * Thus, these native methods, when reflectively viewed by
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   377
 * {@code Class.getDeclaredMethod}, may be regarded as placeholders only.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   378
 * <p>
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   379
 * In order to obtain an invoker method for a particular access mode type,
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   380
 * use {@link java.lang.invoke.MethodHandles#varHandleExactInvoker} or
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   381
 * {@link java.lang.invoke.MethodHandles#varHandleInvoker}.  The
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   382
 * {@link java.lang.invoke.MethodHandles.Lookup#findVirtual Lookup.findVirtual}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   383
 * API is also able to return a method handle to call an access mode method for
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   384
 * any specified access mode type and is equivalent in behaviour to
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   385
 * {@link java.lang.invoke.MethodHandles#varHandleInvoker}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   386
 *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   387
 * <h1>Interoperation between VarHandles and Java generics</h1>
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   388
 * A VarHandle can be obtained for a variable, such as a a field, which is
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   389
 * declared with Java generic types.  As with the Core Reflection API, the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   390
 * VarHandle's variable type will be constructed from the erasure of the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   391
 * source-level type.  When a VarHandle access mode method is invoked, the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   392
 * types
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   393
 * of its arguments or the return value cast type may be generic types or type
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   394
 * instances.  If this occurs, the compiler will replace those types by their
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   395
 * erasures when it constructs the symbolic type descriptor for the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   396
 * {@code invokevirtual} instruction.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   397
 *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   398
 * @see MethodHandle
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   399
 * @see MethodHandles
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   400
 * @see MethodType
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   401
 * @since 9
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   402
 */
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   403
public abstract class VarHandle {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   404
    // Use explicit final fields rather than an @Stable array as
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   405
    // this can reduce the memory per handle
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   406
    // e.g. by 24 bytes on 64 bit architectures
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   407
    final MethodType typeGet;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   408
    final MethodType typeSet;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   409
    final MethodType typeCompareSwap;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   410
    final MethodType typeCompareExchange;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   411
    final MethodType typeGetAndUpdate;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   412
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   413
    final VarForm vform;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   414
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   415
    VarHandle(VarForm vform, Class<?> receiver, Class<?> value, Class<?>... intermediate) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   416
        this.vform = vform;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   417
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   418
        // (Receiver, <Intermediates>)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   419
        List<Class<?>> l = new ArrayList<>();
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   420
        if (receiver != null)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   421
            l.add(receiver);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   422
        l.addAll(Arrays.asList(intermediate));
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   423
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   424
        // (Receiver, <Intermediates>)Value
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   425
        this.typeGet = MethodType.methodType(value, l);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   426
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   427
        // (Receiver, <Intermediates>, Value)void
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   428
        l.add(value);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   429
        this.typeSet = MethodType.methodType(void.class, l);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   430
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   431
        // (Receiver, <Intermediates>, Value)Value
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   432
        this.typeGetAndUpdate = MethodType.methodType(value, l);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   433
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   434
        // (Receiver, <Intermediates>, Value, Value)boolean
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   435
        l.add(value);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   436
        this.typeCompareSwap = MethodType.methodType(boolean.class, l);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   437
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   438
        // (Receiver, <Intermediates>, Value, Value)Value
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   439
        this.typeCompareExchange = MethodType.methodType(value, l);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   440
    }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   441
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   442
    RuntimeException unsupported() {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   443
        return new UnsupportedOperationException();
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   444
    }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   445
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   446
    // Plain accessors
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   447
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   448
    /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   449
     * Returns the value of a variable, with memory semantics of reading as
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   450
     * if the variable was declared non-{@code volatile}.  Commonly referred to
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   451
     * as plain read access.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   452
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   453
     * <p>The method signature is of the form {@code (CT)T}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   454
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   455
     * <p>The symbolic type descriptor at the call site of {@code get}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   456
     * must match the access mode type that is the result of calling
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   457
     * {@code accessModeType(VarHandle.AccessMode.get)} on this VarHandle.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   458
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   459
     * <p>This access mode is supported by all VarHandle instances and never
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   460
     * throws {@code UnsupportedOperationException}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   461
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   462
     * @param args the signature-polymorphic parameter list of the form
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   463
     * {@code (CT)}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   464
     * , statically represented using varargs.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   465
     * @return the signature-polymorphic result that is the value of the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   466
     * variable
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   467
     * , statically represented using {@code Object}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   468
     * @throws WrongMethodTypeException if the access mode type is not
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   469
     * compatible with the caller's symbolic type descriptor.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   470
     */
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   471
    public final native
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   472
    @MethodHandle.PolymorphicSignature
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   473
    @HotSpotIntrinsicCandidate
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   474
    Object get(Object... args);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   475
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   476
    /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   477
     * Sets the value of a variable to the {@code newValue}, with memory
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   478
     * semantics of setting as if the variable was declared non-{@code volatile}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   479
     * and non-{@code final}.  Commonly referred to as plain write access.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   480
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   481
     * <p>The method signature is of the form {@code (CT, T newValue)void}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   482
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   483
     * <p>The symbolic type descriptor at the call site of {@code set}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   484
     * must match the access mode type that is the result of calling
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   485
     * {@code accessModeType(VarHandle.AccessMode.set)} on this VarHandle.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   486
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   487
     * @param args the signature-polymorphic parameter list of the form
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   488
     * {@code (CT, T newValue)}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   489
     * , statically represented using varargs.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   490
     * @throws UnsupportedOperationException if the access mode is unsupported
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   491
     * for this VarHandle.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   492
     * @throws WrongMethodTypeException if the access mode type is not
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   493
     * compatible with the caller's symbolic type descriptor.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   494
     */
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   495
    public final native
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   496
    @MethodHandle.PolymorphicSignature
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   497
    @HotSpotIntrinsicCandidate
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   498
    void set(Object... args);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   499
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   500
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   501
    // Volatile accessors
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   502
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   503
    /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   504
     * Returns the value of a variable, with memory semantics of reading as if
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   505
     * the variable was declared {@code volatile}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   506
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   507
     * <p>The method signature is of the form {@code (CT)T}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   508
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   509
     * <p>The symbolic type descriptor at the call site of {@code getVolatile}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   510
     * must match the access mode type that is the result of calling
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   511
     * {@code accessModeType(VarHandle.AccessMode.getVolatile)} on this VarHandle.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   512
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   513
     * @param args the signature-polymorphic parameter list of the form
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   514
     * {@code (CT)}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   515
     * , statically represented using varargs.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   516
     * @return the signature-polymorphic result that is the value of the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   517
     * variable
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   518
     * , statically represented using {@code Object}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   519
     * @throws UnsupportedOperationException if the access mode is unsupported
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   520
     * for this VarHandle.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   521
     * @throws WrongMethodTypeException if the access mode type is not
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   522
     * compatible with the caller's symbolic type descriptor.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   523
     */
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   524
    public final native
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   525
    @MethodHandle.PolymorphicSignature
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   526
    @HotSpotIntrinsicCandidate
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   527
    Object getVolatile(Object... args);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   528
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   529
    /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   530
     * Sets the value of a variable to the {@code newValue}, with memory
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   531
     * semantics of setting as if the variable was declared {@code volatile}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   532
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   533
     * <p>The method signature is of the form {@code (CT, T newValue)void}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   534
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   535
     * <p>The symbolic type descriptor at the call site of {@code setVolatile}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   536
     * must match the access mode type that is the result of calling
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   537
     * {@code accessModeType(VarHandle.AccessMode.setVolatile)} on this VarHandle.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   538
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   539
     * @param args the signature-polymorphic parameter list of the form
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   540
     * {@code (CT, T newValue)}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   541
     * , statically represented using varargs.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   542
     * @throws UnsupportedOperationException if the access mode is unsupported
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   543
     * for this VarHandle.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   544
     * @throws WrongMethodTypeException if the access mode type is not
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   545
     * compatible with the caller's symbolic type descriptor.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   546
     * @apiNote Ignoring the many semantic differences from C and C++, this
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   547
     * method has memory ordering effects compatible with
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   548
     * {@code memory_order_seq_cst}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   549
     */
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   550
    public final native
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   551
    @MethodHandle.PolymorphicSignature
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   552
    @HotSpotIntrinsicCandidate
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   553
    void setVolatile(Object... args);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   554
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   555
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   556
    /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   557
     * Returns the value of a variable, accessed in program order, but with no
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   558
     * assurance of memory ordering effects with respect to other threads.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   559
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   560
     * <p>The method signature is of the form {@code (CT)T}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   561
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   562
     * <p>The symbolic type descriptor at the call site of {@code getOpaque}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   563
     * must match the access mode type that is the result of calling
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   564
     * {@code accessModeType(VarHandle.AccessMode.getOpaque)} on this VarHandle.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   565
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   566
     * @param args the signature-polymorphic parameter list of the form
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   567
     * {@code (CT)}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   568
     * , statically represented using varargs.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   569
     * @return the signature-polymorphic result that is the value of the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   570
     * variable
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   571
     * , statically represented using {@code Object}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   572
     * @throws UnsupportedOperationException if the access mode is unsupported
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   573
     * for this VarHandle.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   574
     * @throws WrongMethodTypeException if the access mode type is not
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   575
     * compatible with the caller's symbolic type descriptor.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   576
     */
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   577
    public final native
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   578
    @MethodHandle.PolymorphicSignature
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   579
    @HotSpotIntrinsicCandidate
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   580
    Object getOpaque(Object... args);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   581
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   582
    /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   583
     * Sets the value of a variable to the {@code newValue}, in program order,
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   584
     * but with no assurance of memory ordering effects with respect to other
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   585
     * threads.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   586
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   587
     * <p>The method signature is of the form {@code (CT, T newValue)void}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   588
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   589
     * <p>The symbolic type descriptor at the call site of {@code setOpaque}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   590
     * must match the access mode type that is the result of calling
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   591
     * {@code accessModeType(VarHandle.AccessMode.setOpaque)} on this VarHandle.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   592
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   593
     * @param args the signature-polymorphic parameter list of the form
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   594
     * {@code (CT, T newValue)}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   595
     * , statically represented using varargs.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   596
     * @throws UnsupportedOperationException if the access mode is unsupported
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   597
     * for this VarHandle.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   598
     * @throws WrongMethodTypeException if the access mode type is not
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   599
     * compatible with the caller's symbolic type descriptor.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   600
     */
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   601
    public final native
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   602
    @MethodHandle.PolymorphicSignature
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   603
    @HotSpotIntrinsicCandidate
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   604
    void setOpaque(Object... args);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   605
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   606
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   607
    // Lazy accessors
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   608
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   609
    /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   610
     * Returns the value of a variable, and ensures that subsequent loads and
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   611
     * stores are not reordered before this access.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   612
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   613
     * <p>The method signature is of the form {@code (CT)T}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   614
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   615
     * <p>The symbolic type descriptor at the call site of {@code getAcquire}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   616
     * must match the access mode type that is the result of calling
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   617
     * {@code accessModeType(VarHandle.AccessMode.getAcquire)} on this VarHandle.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   618
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   619
     * @param args the signature-polymorphic parameter list of the form
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   620
     * {@code (CT)}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   621
     * , statically represented using varargs.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   622
     * @return the signature-polymorphic result that is the value of the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   623
     * variable
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   624
     * , statically represented using {@code Object}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   625
     * @throws UnsupportedOperationException if the access mode is unsupported
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   626
     * for this VarHandle.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   627
     * @throws WrongMethodTypeException if the access mode type is not
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   628
     * compatible with the caller's symbolic type descriptor.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   629
     * @apiNote Ignoring the many semantic differences from C and C++, this
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   630
     * method has memory ordering effects compatible with
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   631
     * {@code memory_order_acquire} ordering.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   632
     */
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   633
    public final native
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   634
    @MethodHandle.PolymorphicSignature
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   635
    @HotSpotIntrinsicCandidate
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   636
    Object getAcquire(Object... args);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   637
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   638
    /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   639
     * Sets the value of a variable to the {@code newValue}, and ensures that
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   640
     * prior loads and stores are not reordered after this access.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   641
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   642
     * <p>The method signature is of the form {@code (CT, T newValue)void}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   643
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   644
     * <p>The symbolic type descriptor at the call site of {@code setRelease}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   645
     * must match the access mode type that is the result of calling
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   646
     * {@code accessModeType(VarHandle.AccessMode.setRelease)} on this VarHandle.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   647
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   648
     * @param args the signature-polymorphic parameter list of the form
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   649
     * {@code (CT, T newValue)}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   650
     * , statically represented using varargs.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   651
     * @throws UnsupportedOperationException if the access mode is unsupported
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   652
     * for this VarHandle.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   653
     * @throws WrongMethodTypeException if the access mode type is not
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   654
     * compatible with the caller's symbolic type descriptor.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   655
     * @apiNote Ignoring the many semantic differences from C and C++, this
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   656
     * method has memory ordering effects compatible with
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   657
     * {@code memory_order_release} ordering.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   658
     */
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   659
    public final native
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   660
    @MethodHandle.PolymorphicSignature
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   661
    @HotSpotIntrinsicCandidate
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   662
    void setRelease(Object... args);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   663
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   664
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   665
    // Compare and set accessors
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   666
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   667
    /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   668
     * Atomically sets the value of a variable to the {@code newValue} with the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   669
     * memory semantics of {@link #setVolatile} if the variable's current value,
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   670
     * referred to as the <em>witness value</em>, {@code ==} the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   671
     * {@code expectedValue}, as accessed with the memory semantics of
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   672
     * {@link #getVolatile}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   673
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   674
     * <p>The method signature is of the form {@code (CT, T expectedValue, T newValue)boolean}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   675
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   676
     * <p>The symbolic type descriptor at the call site of {@code
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   677
     * compareAndSet} must match the access mode type that is the result of
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   678
     * calling {@code accessModeType(VarHandle.AccessMode.compareAndSet)} on
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   679
     * this VarHandle.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   680
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   681
     * @param args the signature-polymorphic parameter list of the form
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   682
     * {@code (CT, T expectedValue, T newValue)}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   683
     * , statically represented using varargs.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   684
     * @return {@code true} if successful, otherwise {@code false} if the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   685
     * witness value was not the same as the {@code expectedValue}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   686
     * @throws UnsupportedOperationException if the access mode is unsupported
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   687
     * for this VarHandle.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   688
     * @throws WrongMethodTypeException if the access mode type is not
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   689
     * compatible with the caller's symbolic type descriptor.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   690
     * @see #setVolatile(Object...)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   691
     * @see #getVolatile(Object...)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   692
     */
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   693
    public final native
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   694
    @MethodHandle.PolymorphicSignature
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   695
    @HotSpotIntrinsicCandidate
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   696
    boolean compareAndSet(Object... args);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   697
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   698
    /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   699
     * Atomically sets the value of a variable to the {@code newValue} with the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   700
     * memory semantics of {@link #setVolatile} if the variable's current value,
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   701
     * referred to as the <em>witness value</em>, {@code ==} the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   702
     * {@code expectedValue}, as accessed with the memory semantics of
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   703
     * {@link #getVolatile}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   704
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   705
     * <p>The method signature is of the form {@code (CT, T expectedValue, T newValue)T}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   706
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   707
     * <p>The symbolic type descriptor at the call site of {@code
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   708
     * compareAndExchangeVolatile}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   709
     * must match the access mode type that is the result of calling
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   710
     * {@code accessModeType(VarHandle.AccessMode.compareAndExchangeVolatile)}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   711
     * on this VarHandle.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   712
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   713
     * @param args the signature-polymorphic parameter list of the form
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   714
     * {@code (CT, T expectedValue, T newValue)}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   715
     * , statically represented using varargs.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   716
     * @return the signature-polymorphic result that is the witness value, which
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   717
     * will be the same as the {@code expectedValue} if successful
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   718
     * , statically represented using {@code Object}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   719
     * @throws UnsupportedOperationException if the access mode is unsupported
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   720
     * for this VarHandle.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   721
     * @throws WrongMethodTypeException if the access mode type is not
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   722
     * compatible with the caller's symbolic type descriptor.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   723
     * @see #setVolatile(Object...)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   724
     * @see #getVolatile(Object...)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   725
     */
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   726
    public final native
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   727
    @MethodHandle.PolymorphicSignature
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   728
    @HotSpotIntrinsicCandidate
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   729
    Object compareAndExchangeVolatile(Object... args);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   730
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   731
    /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   732
     * Atomically sets the value of a variable to the {@code newValue} with the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   733
     * memory semantics of {@link #set} if the variable's current value,
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   734
     * referred to as the <em>witness value</em>, {@code ==} the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   735
     * {@code expectedValue}, as accessed with the memory semantics of
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   736
     * {@link #getAcquire}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   737
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   738
     * <p>The method signature is of the form {@code (CT, T expectedValue, T newValue)T}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   739
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   740
     * <p>The symbolic type descriptor at the call site of {@code
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   741
     * compareAndExchangeAcquire}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   742
     * must match the access mode type that is the result of calling
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   743
     * {@code accessModeType(VarHandle.AccessMode.compareAndExchangeAcquire)} on
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   744
     * this VarHandle.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   745
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   746
     * @param args the signature-polymorphic parameter list of the form
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   747
     * {@code (CT, T expectedValue, T newValue)}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   748
     * , statically represented using varargs.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   749
     * @return the signature-polymorphic result that is the witness value, which
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   750
     * will be the same as the {@code expectedValue} if successful
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   751
     * , statically represented using {@code Object}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   752
     * @throws UnsupportedOperationException if the access mode is unsupported
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   753
     * for this VarHandle.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   754
     * @throws WrongMethodTypeException if the access mode type is not
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   755
     * compatible with the caller's symbolic type descriptor.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   756
     * @see #set(Object...)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   757
     * @see #getAcquire(Object...)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   758
     */
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   759
    public final native
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   760
    @MethodHandle.PolymorphicSignature
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   761
    @HotSpotIntrinsicCandidate
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   762
    Object compareAndExchangeAcquire(Object... args);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   763
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   764
    /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   765
     * Atomically sets the value of a variable to the {@code newValue} with the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   766
     * memory semantics of {@link #setRelease} if the variable's current value,
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   767
     * referred to as the <em>witness value</em>, {@code ==} the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   768
     * {@code expectedValue}, as accessed with the memory semantics of
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   769
     * {@link #get}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   770
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   771
     * <p>The method signature is of the form {@code (CT, T expectedValue, T newValue)T}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   772
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   773
     * <p>The symbolic type descriptor at the call site of {@code
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   774
     * compareAndExchangeRelease}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   775
     * must match the access mode type that is the result of calling
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   776
     * {@code accessModeType(VarHandle.AccessMode.compareAndExchangeRelease)} on this VarHandle.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   777
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   778
     * @param args the signature-polymorphic parameter list of the form
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   779
     * {@code (CT, T expectedValue, T newValue)}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   780
     * , statically represented using varargs.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   781
     * @return the signature-polymorphic result that is the witness value, which
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   782
     * will be the same as the {@code expectedValue} if successful
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   783
     * , statically represented using {@code Object}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   784
     * @throws UnsupportedOperationException if the access mode is unsupported
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   785
     * for this VarHandle.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   786
     * @throws WrongMethodTypeException if the access mode type is not
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   787
     * compatible with the caller's symbolic type descriptor.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   788
     * @see #setRelease(Object...)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   789
     * @see #get(Object...)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   790
     */
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   791
    public final native
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   792
    @MethodHandle.PolymorphicSignature
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   793
    @HotSpotIntrinsicCandidate
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   794
    Object compareAndExchangeRelease(Object... args);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   795
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   796
    // Weak (spurious failures allowed)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   797
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   798
    /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   799
     * Possibly atomically sets the value of a variable to the {@code newValue}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   800
     * with the semantics of {@link #set} if the variable's current value,
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   801
     * referred to as the <em>witness value</em>, {@code ==} the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   802
     * {@code expectedValue}, as accessed with the memory semantics of
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   803
     * {@link #get}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   804
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   805
     * <p>This operation may fail spuriously (typically, due to memory
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   806
     * contention) even if the current value does match the expected value.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   807
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   808
     * <p>The method signature is of the form {@code (CT, T expectedValue, T newValue)boolean}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   809
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   810
     * <p>The symbolic type descriptor at the call site of {@code
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   811
     * weakCompareAndSet} must match the access mode type that is the result of
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   812
     * calling {@code accessModeType(VarHandle.AccessMode.weakCompareAndSet)} on
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   813
     * this VarHandle.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   814
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   815
     * @param args the signature-polymorphic parameter list of the form
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   816
     * {@code (CT, T expectedValue, T newValue)}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   817
     * , statically represented using varargs.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   818
     * @return {@code true} if successful, otherwise {@code false} if the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   819
     * witness value was not the same as the {@code expectedValue} or if this
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   820
     * operation spuriously failed.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   821
     * @throws UnsupportedOperationException if the access mode is unsupported
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   822
     * for this VarHandle.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   823
     * @throws WrongMethodTypeException if the access mode type is not
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   824
     * compatible with the caller's symbolic type descriptor.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   825
     * @see #set(Object...)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   826
     * @see #get(Object...)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   827
     */
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   828
    public final native
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   829
    @MethodHandle.PolymorphicSignature
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   830
    @HotSpotIntrinsicCandidate
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   831
    boolean weakCompareAndSet(Object... args);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   832
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   833
    /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   834
     * Possibly atomically sets the value of a variable to the {@code newValue}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   835
     * with the semantics of {@link #set} if the variable's current value,
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   836
     * referred to as the <em>witness value</em>, {@code ==} the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   837
     * {@code expectedValue}, as accessed with the memory semantics of
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   838
     * {@link #getAcquire}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   839
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   840
     * <p>This operation may fail spuriously (typically, due to memory
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   841
     * contention) even if the current value does match the expected value.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   842
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   843
     * <p>The method signature is of the form {@code (CT, T expectedValue, T newValue)boolean}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   844
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   845
     * <p>The symbolic type descriptor at the call site of {@code
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   846
     * weakCompareAndSetAcquire}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   847
     * must match the access mode type that is the result of calling
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   848
     * {@code accessModeType(VarHandle.AccessMode.weakCompareAndSetAcquire)} on this VarHandle.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   849
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   850
     * @param args the signature-polymorphic parameter list of the form
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   851
     * {@code (CT, T expectedValue, T newValue)}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   852
     * , statically represented using varargs.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   853
     * @return {@code true} if successful, otherwise {@code false} if the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   854
     * witness value was not the same as the {@code expectedValue} or if this
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   855
     * operation spuriously failed.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   856
     * @throws UnsupportedOperationException if the access mode is unsupported
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   857
     * for this VarHandle.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   858
     * @throws WrongMethodTypeException if the access mode type is not
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   859
     * compatible with the caller's symbolic type descriptor.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   860
     * @see #set(Object...)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   861
     * @see #getAcquire(Object...)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   862
     */
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   863
    public final native
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   864
    @MethodHandle.PolymorphicSignature
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   865
    @HotSpotIntrinsicCandidate
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   866
    boolean weakCompareAndSetAcquire(Object... args);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   867
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   868
    /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   869
     * Possibly atomically sets the value of a variable to the {@code newValue}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   870
     * with the semantics of {@link #setRelease} if the variable's current
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   871
     * value, referred to as the <em>witness value</em>, {@code ==} the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   872
     * {@code expectedValue}, as accessed with the memory semantics of
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   873
     * {@link #get}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   874
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   875
     * <p>This operation may fail spuriously (typically, due to memory
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   876
     * contention) even if the current value does match the expected value.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   877
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   878
     * <p>The method signature is of the form {@code (CT, T expectedValue, T newValue)boolean}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   879
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   880
     * <p>The symbolic type descriptor at the call site of {@code
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   881
     * weakCompareAndSetRelease}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   882
     * must match the access mode type that is the result of calling
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   883
     * {@code accessModeType(VarHandle.AccessMode.weakCompareAndSetRelease)} on this VarHandle.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   884
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   885
     * @param args the signature-polymorphic parameter list of the form
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   886
     * {@code (CT, T expectedValue, T newValue)}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   887
     * , statically represented using varargs.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   888
     * @return {@code true} if successful, otherwise {@code false} if the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   889
     * witness value was not the same as the {@code expectedValue} or if this
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   890
     * operation spuriously failed.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   891
     * @throws UnsupportedOperationException if the access mode is unsupported
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   892
     * for this VarHandle.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   893
     * @throws WrongMethodTypeException if the access mode type is not
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   894
     * compatible with the caller's symbolic type descriptor.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   895
     * @see #setRelease(Object...)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   896
     * @see #get(Object...)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   897
     */
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   898
    public final native
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   899
    @MethodHandle.PolymorphicSignature
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   900
    @HotSpotIntrinsicCandidate
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   901
    boolean weakCompareAndSetRelease(Object... args);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   902
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   903
    /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   904
     * Atomically sets the value of a variable to the {@code newValue} with the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   905
     * memory semantics of {@link #setVolatile} and returns the variable's
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   906
     * previous value, as accessed with the memory semantics of
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   907
     * {@link #getVolatile}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   908
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   909
     * <p>The method signature is of the form {@code (CT, T newValue)T}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   910
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   911
     * <p>The symbolic type descriptor at the call site of {@code getAndSet}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   912
     * must match the access mode type that is the result of calling
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   913
     * {@code accessModeType(VarHandle.AccessMode.getAndSet)} on this VarHandle.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   914
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   915
     * @param args the signature-polymorphic parameter list of the form
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   916
     * {@code (CT, T newValue)}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   917
     * , statically represented using varargs.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   918
     * @return the signature-polymorphic result that is the previous value of
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   919
     * the variable
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   920
     * , statically represented using {@code Object}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   921
     * @throws UnsupportedOperationException if the access mode is unsupported
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   922
     * for this VarHandle.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   923
     * @throws WrongMethodTypeException if the access mode type is not
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   924
     * compatible with the caller's symbolic type descriptor.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   925
     * @see #setVolatile(Object...)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   926
     * @see #getVolatile(Object...)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   927
     */
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   928
    public final native
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   929
    @MethodHandle.PolymorphicSignature
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   930
    @HotSpotIntrinsicCandidate
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   931
    Object getAndSet(Object... args);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   932
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   933
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   934
    // Primitive adders
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   935
    // Throw UnsupportedOperationException for refs
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   936
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   937
    /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   938
     * Atomically adds the {@code value} to the current value of a variable with
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   939
     * the memory semantics of {@link #setVolatile}, and returns the variable's
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   940
     * previous value, as accessed with the memory semantics of
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   941
     * {@link #getVolatile}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   942
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   943
     * <p>The method signature is of the form {@code (CT, T value)T}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   944
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   945
     * <p>The symbolic type descriptor at the call site of {@code getAndAdd}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   946
     * must match the access mode type that is the result of calling
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   947
     * {@code accessModeType(VarHandle.AccessMode.getAndAdd)} on this VarHandle.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   948
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   949
     * @param args the signature-polymorphic parameter list of the form
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   950
     * {@code (CT, T value)}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   951
     * , statically represented using varargs.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   952
     * @return the signature-polymorphic result that is the previous value of
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   953
     * the variable
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   954
     * , statically represented using {@code Object}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   955
     * @throws UnsupportedOperationException if the access mode is unsupported
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   956
     * for this VarHandle.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   957
     * @throws WrongMethodTypeException if the access mode type is not
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   958
     * compatible with the caller's symbolic type descriptor.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   959
     * @see #setVolatile(Object...)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   960
     * @see #getVolatile(Object...)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   961
     */
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   962
    public final native
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   963
    @MethodHandle.PolymorphicSignature
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   964
    @HotSpotIntrinsicCandidate
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   965
    Object getAndAdd(Object... args);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   966
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   967
    /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   968
     * Atomically adds the {@code value} to the current value of a variable with
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   969
     * the memory semantics of {@link #setVolatile}, and returns the variable's
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   970
     * current (updated) value, as accessed with the memory semantics of
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   971
     * {@link #getVolatile}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   972
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   973
     * <p>The method signature is of the form {@code (CT, T value)T}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   974
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   975
     * <p>The symbolic type descriptor at the call site of {@code addAndGet}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   976
     * must match the access mode type that is the result of calling
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   977
     * {@code accessModeType(VarHandle.AccessMode.addAndGet)} on this VarHandle.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   978
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   979
     * @param args the signature-polymorphic parameter list of the form
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   980
     * {@code (CT, T value)}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   981
     * , statically represented using varargs.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   982
     * @return the signature-polymorphic result that is the current value of
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   983
     * the variable
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   984
     * , statically represented using {@code Object}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   985
     * @throws UnsupportedOperationException if the access mode is unsupported
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   986
     * for this VarHandle.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   987
     * @throws WrongMethodTypeException if the access mode type is not
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   988
     * compatible with the caller's symbolic type descriptor.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   989
     * @see #setVolatile(Object...)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   990
     * @see #getVolatile(Object...)
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   991
     */
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   992
    public final native
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   993
    @MethodHandle.PolymorphicSignature
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   994
    @HotSpotIntrinsicCandidate
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   995
    Object addAndGet(Object... args);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   996
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
   997
    enum AccessType {
37343
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
   998
        GET,                    // 0
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
   999
        SET,                    // 1
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1000
        COMPARE_AND_SWAP,       // 2
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1001
        COMPARE_AND_EXCHANGE,   // 3
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1002
        GET_AND_UPDATE;         // 4
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1003
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1004
        MethodType getMethodType(VarHandle vh) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1005
            return getMethodType(this.ordinal(), vh);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1006
        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1007
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1008
        @ForceInline
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1009
        static MethodType getMethodType(int ordinal, VarHandle vh) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1010
            if (ordinal == 0) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1011
                return vh.typeGet;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1012
            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1013
            else if (ordinal == 1) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1014
                return vh.typeSet;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1015
            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1016
            else if (ordinal == 2) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1017
                return vh.typeCompareSwap;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1018
            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1019
            else if (ordinal == 3) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1020
                return vh.typeCompareExchange;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1021
            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1022
            else if (ordinal == 4) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1023
                return vh.typeGetAndUpdate;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1024
            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1025
            else {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1026
                throw new IllegalStateException("Illegal access type: " + ordinal);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1027
            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1028
        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1029
    }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1030
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1031
    /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1032
     * The set of access modes that specify how a variable, referenced by a
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1033
     * VarHandle, is accessed.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1034
     */
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1035
    public enum AccessMode {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1036
        /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1037
         * The access mode whose access is specified by the corresponding
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1038
         * method
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1039
         * {@link VarHandle#get VarHandle.get}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1040
         */
37343
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1041
        GET("get", AccessType.GET, Object.class),   // 0
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1042
        /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1043
         * The access mode whose access is specified by the corresponding
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1044
         * method
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1045
         * {@link VarHandle#set VarHandle.set}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1046
         */
37343
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1047
        SET("set", AccessType.SET, void.class),     // 1
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1048
        /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1049
         * The access mode whose access is specified by the corresponding
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1050
         * method
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1051
         * {@link VarHandle#getVolatile VarHandle.getVolatile}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1052
         */
37343
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1053
        GET_VOLATILE("getVolatile", AccessType.GET, Object.class),  // 2
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1054
        /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1055
         * The access mode whose access is specified by the corresponding
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1056
         * method
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1057
         * {@link VarHandle#setVolatile VarHandle.setVolatile}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1058
         */
37343
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1059
        SET_VOLATILE("setVolatile", AccessType.SET, void.class),    // 3
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1060
        /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1061
         * The access mode whose access is specified by the corresponding
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1062
         * method
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1063
         * {@link VarHandle#getAcquire VarHandle.getAcquire}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1064
         */
37343
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1065
        GET_ACQUIRE("getAcquire", AccessType.GET, Object.class),   // 4
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1066
        /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1067
         * The access mode whose access is specified by the corresponding
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1068
         * method
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1069
         * {@link VarHandle#setRelease VarHandle.setRelease}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1070
         */
37343
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1071
        SET_RELEASE("setRelease", AccessType.SET, void.class),     // 5
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1072
        /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1073
         * The access mode whose access is specified by the corresponding
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1074
         * method
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1075
         * {@link VarHandle#getOpaque VarHandle.getOpaque}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1076
         */
37343
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1077
        GET_OPAQUE("getOpaque", AccessType.GET, Object.class),    // 6
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1078
        /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1079
         * The access mode whose access is specified by the corresponding
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1080
         * method
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1081
         * {@link VarHandle#setOpaque VarHandle.setOpaque}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1082
         */
37343
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1083
        SET_OPAQUE("setOpaque", AccessType.SET, void.class),      // 7
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1084
        /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1085
         * The access mode whose access is specified by the corresponding
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1086
         * method
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1087
         * {@link VarHandle#compareAndSet VarHandle.compareAndSet}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1088
         */
37343
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1089
        COMPARE_AND_SET("compareAndSet", AccessType.COMPARE_AND_SWAP, boolean.class),    // 8
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1090
        /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1091
         * The access mode whose access is specified by the corresponding
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1092
         * method
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1093
         * {@link VarHandle#compareAndExchangeVolatile VarHandle.compareAndExchangeVolatile}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1094
         */
37343
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1095
        COMPARE_AND_EXCHANGE_VOLATILE("compareAndExchangeVolatile", AccessType.COMPARE_AND_EXCHANGE, Object.class), // 9
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1096
        /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1097
         * The access mode whose access is specified by the corresponding
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1098
         * method
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1099
         * {@link VarHandle#compareAndExchangeAcquire VarHandle.compareAndExchangeAcquire}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1100
         */
37343
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1101
        COMPARE_AND_EXCHANGE_ACQUIRE("compareAndExchangeAcquire", AccessType.COMPARE_AND_EXCHANGE, Object.class),  // 10
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1102
        /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1103
         * The access mode whose access is specified by the corresponding
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1104
         * method
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1105
         * {@link VarHandle#compareAndExchangeRelease VarHandle.compareAndExchangeRelease}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1106
         */
37343
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1107
        COMPARE_AND_EXCHANGE_RELEASE("compareAndExchangeRelease", AccessType.COMPARE_AND_EXCHANGE, Object.class),  // 11
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1108
        /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1109
         * The access mode whose access is specified by the corresponding
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1110
         * method
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1111
         * {@link VarHandle#weakCompareAndSet VarHandle.weakCompareAndSet}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1112
         */
37343
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1113
        WEAK_COMPARE_AND_SET("weakCompareAndSet", AccessType.COMPARE_AND_SWAP, boolean.class),        // 12
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1114
        /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1115
         * The access mode whose access is specified by the corresponding
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1116
         * method
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1117
         * {@link VarHandle#weakCompareAndSetAcquire VarHandle.weakCompareAndSetAcquire}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1118
         */
37343
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1119
        WEAK_COMPARE_AND_SET_ACQUIRE("weakCompareAndSetAcquire", AccessType.COMPARE_AND_SWAP, boolean.class), // 13
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1120
        /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1121
         * The access mode whose access is specified by the corresponding
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1122
         * method
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1123
         * {@link VarHandle#weakCompareAndSetRelease VarHandle.weakCompareAndSetRelease}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1124
         */
37343
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1125
        WEAK_COMPARE_AND_SET_RELEASE("weakCompareAndSetRelease", AccessType.COMPARE_AND_SWAP, boolean.class), // 14
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1126
        /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1127
         * The access mode whose access is specified by the corresponding
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1128
         * method
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1129
         * {@link VarHandle#getAndSet VarHandle.getAndSet}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1130
         */
37343
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1131
        GET_AND_SET("getAndSet", AccessType.GET_AND_UPDATE, Object.class),   // 15
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1132
        /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1133
         * The access mode whose access is specified by the corresponding
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1134
         * method
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1135
         * {@link VarHandle#getAndAdd VarHandle.getAndAdd}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1136
         */
37343
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1137
        GET_AND_ADD("getAndAdd", AccessType.GET_AND_UPDATE, Object.class),   // 16
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1138
        /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1139
         * The access mode whose access is specified by the corresponding
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1140
         * method
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1141
         * {@link VarHandle#addAndGet VarHandle.addAndGet}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1142
         */
37343
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1143
        ADD_AND_GET("addAndGet", AccessType.GET_AND_UPDATE, Object.class),   // 17
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1144
        ;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1145
37343
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1146
        static final Map<String, AccessMode> methodNameToAccessMode;
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1147
        static {
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1148
            // Initial capacity of # values is sufficient to avoid resizes
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1149
            // for the smallest table size (32)
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1150
            methodNameToAccessMode = new HashMap<>(AccessMode.values().length);
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1151
            for (AccessMode am : AccessMode.values()) {
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1152
                methodNameToAccessMode.put(am.methodName, am);
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1153
            }
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1154
        }
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1155
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1156
        final String methodName;
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1157
        final AccessType at;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1158
        final boolean isPolyMorphicInReturnType;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1159
        final Class<?> returnType;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1160
37343
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1161
        AccessMode(final String methodName, AccessType at, Class<?> returnType) {
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1162
            this.methodName = methodName;
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1163
            this.at = at;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1164
37343
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1165
            // Assert method name is correctly derived from value name
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1166
            assert methodName.equals(toMethodName(name()));
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1167
            // Assert that return type is correct
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1168
            // Otherwise, when disabled avoid using reflection
37343
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1169
            assert returnType == getReturnType(methodName);
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1170
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1171
            this.returnType = returnType;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1172
            isPolyMorphicInReturnType = returnType != Object.class;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1173
        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1174
37343
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1175
        /**
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1176
         * Returns the {@code VarHandle} signature-polymorphic method name
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1177
         * associated with this {@code AccessMode} value
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1178
         *
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1179
         * @return the signature-polymorphic method name
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1180
         * @see #valueFromMethodName
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1181
         */
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1182
        public String methodName() {
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1183
            return methodName;
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1184
        }
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1185
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1186
        /**
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1187
         * Returns the {@code AccessMode} value associated with the specified
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1188
         * {@code VarHandle} signature-polymorphic method name.
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1189
         *
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1190
         * @param methodName the signature-polymorphic method name
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1191
         * @return the {@code AccessMode} value
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1192
         * @throws IllegalArgumentException if there is no {@code AccessMode}
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1193
         *         value associated with method name (indicating the method
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1194
         *         name does not correspond to a {@code VarHandle}
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1195
         *         signature-polymorphic method name).
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1196
         * @see #methodName
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1197
         */
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1198
        public static AccessMode valueFromMethodName(String methodName) {
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1199
            AccessMode am = methodNameToAccessMode.get(methodName);
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1200
            if (am != null) return am;
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1201
            throw new IllegalArgumentException("No AccessMode value for method name " + methodName);
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1202
        }
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1203
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1204
        private static String toMethodName(String name) {
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1205
            StringBuilder s = new StringBuilder(name.toLowerCase());
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1206
            int i;
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1207
            while ((i = s.indexOf("_")) !=  -1) {
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1208
                s.deleteCharAt(i);
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1209
                s.setCharAt(i, Character.toUpperCase(s.charAt(i)));
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1210
            }
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1211
            return s.toString();
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1212
        }
35a2231828a7 8151705: VarHandle.AccessMode enum names should conform to code style
psandoz
parents: 36973
diff changeset
  1213
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1214
        private static Class<?> getReturnType(String name) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1215
            try {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1216
                Method m = VarHandle.class.getMethod(name, Object[].class);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1217
                return m.getReturnType();
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1218
            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1219
            catch (Exception e) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1220
                throw newInternalError(e);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1221
            }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1222
        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1223
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1224
        @ForceInline
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1225
        static MemberName getMemberName(int ordinal, VarForm vform) {
36973
951bb58383a4 8151706: Update VarHandle implementation to use @Stable arrays
psandoz
parents: 36934
diff changeset
  1226
            return vform.table[ordinal];
36934
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1227
        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1228
    }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1229
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1230
    static final class AccessDescriptor {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1231
        final MethodType symbolicMethodType;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1232
        final int type;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1233
        final int mode;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1234
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1235
        public AccessDescriptor(MethodType symbolicMethodType, int type, int mode) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1236
            this.symbolicMethodType = symbolicMethodType;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1237
            this.type = type;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1238
            this.mode = mode;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1239
        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1240
    }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1241
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1242
    /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1243
     * Returns the variable type of variables referenced by this VarHandle.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1244
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1245
     * @return the variable type of variables referenced by this VarHandle
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1246
     */
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1247
    public final Class<?> varType() {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1248
        return typeSet.parameterType(typeSet.parameterCount() - 1);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1249
    }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1250
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1251
    /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1252
     * Returns the coordinate types for this VarHandle.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1253
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1254
     * @return the coordinate types for this VarHandle. The returned
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1255
     * list is unmodifiable
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1256
     */
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1257
    public final List<Class<?>> coordinateTypes() {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1258
        return typeGet.parameterList();
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1259
    }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1260
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1261
    /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1262
     * Obtains the canonical access mode type for this VarHandle and a given
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1263
     * access mode.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1264
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1265
     * <p>The access mode type's parameter types will consist of a prefix that
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1266
     * is the coordinate types of this VarHandle followed by further
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1267
     * types as defined by the access mode's method.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1268
     * The access mode type's return type is defined by the return type of the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1269
     * access mode's method.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1270
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1271
     * @param accessMode the access mode, corresponding to the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1272
     * signature-polymorphic method of the same name
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1273
     * @return the access mode type for the given access mode
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1274
     */
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1275
    public final MethodType accessModeType(AccessMode accessMode) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1276
        return accessMode.at.getMethodType(this);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1277
    }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1278
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1279
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1280
    /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1281
     * Returns {@code true} if the given access mode is supported, otherwise
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1282
     * {@code false}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1283
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1284
     * <p>The return of a {@code false} value for a given access mode indicates
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1285
     * that an {@code UnsupportedOperationException} is thrown on invocation
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1286
     * of the corresponding access mode's signature-polymorphic method.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1287
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1288
     * @param accessMode the access mode, corresponding to the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1289
     * signature-polymorphic method of the same name
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1290
     * @return {@code true} if the given access mode is supported, otherwise
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1291
     * {@code false}.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1292
     */
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1293
    public final boolean isAccessModeSupported(AccessMode accessMode) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1294
        return AccessMode.getMemberName(accessMode.ordinal(), vform) != null;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1295
    }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1296
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1297
    /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1298
     * Obtains a method handle bound to this VarHandle and the given access
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1299
     * mode.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1300
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1301
     * @apiNote This method, for a VarHandle {@code vh} and access mode
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1302
     * {@code {access-mode}}, returns a method handle that is equivalent to
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1303
     * method handle {@code bhm} in the following code (though it may be more
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1304
     * efficient):
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1305
     * <pre>{@code
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1306
     * MethodHandle mh = MethodHandles.varHandleExactInvoker(
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1307
     *                       vh.accessModeType(VarHandle.AccessMode.{access-mode}));
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1308
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1309
     * MethodHandle bmh = mh.bindTo(vh);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1310
     * }</pre>
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1311
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1312
     * @param accessMode the access mode, corresponding to the
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1313
     * signature-polymorphic method of the same name
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1314
     * @return a method handle bound to this VarHandle and the given access mode
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1315
     */
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1316
    public final MethodHandle toMethodHandle(AccessMode accessMode) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1317
        MemberName mn = AccessMode.getMemberName(accessMode.ordinal(), vform);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1318
        if (mn != null) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1319
            return DirectMethodHandle.make(mn).
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1320
                    bindTo(this).
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1321
                    asType(accessMode.at.getMethodType(this));
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1322
        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1323
        else {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1324
            // Ensure an UnsupportedOperationException is thrown
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1325
            return MethodHandles.varHandleInvoker(accessMode, accessModeType(accessMode)).
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1326
                    bindTo(this);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1327
        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1328
    }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1329
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1330
    /*non-public*/
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1331
    final void updateVarForm(VarForm newVForm) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1332
        if (vform == newVForm) return;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1333
        UNSAFE.putObject(this, VFORM_OFFSET, newVForm);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1334
        UNSAFE.fullFence();
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1335
    }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1336
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1337
    static final BiFunction<Integer, Integer, ArrayIndexOutOfBoundsException> AIOOBE_SUPPLIER = new BiFunction<>() {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1338
        @Override
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1339
        public ArrayIndexOutOfBoundsException apply(Integer a, Integer b) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1340
            return new ArrayIndexOutOfBoundsException(a, b);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1341
        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1342
    };
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1343
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1344
    private static final long VFORM_OFFSET;
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1345
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1346
    static {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1347
        try {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1348
            VFORM_OFFSET = UNSAFE.objectFieldOffset(VarHandle.class.getDeclaredField("vform"));
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1349
        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1350
        catch (ReflectiveOperationException e) {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1351
            throw newInternalError(e);
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1352
        }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1353
    }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1354
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1355
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1356
    // Fence methods
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1357
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1358
    /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1359
     * Ensures that loads and stores before the fence will not be reordered
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1360
     * with
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1361
     * loads and stores after the fence.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1362
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1363
     * @apiNote Ignoring the many semantic differences from C and C++, this
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1364
     * method has memory ordering effects compatible with
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1365
     * {@code atomic_thread_fence(memory_order_seq_cst)}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1366
     */
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1367
    @ForceInline
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1368
    public static void fullFence() {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1369
        UNSAFE.fullFence();
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1370
    }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1371
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1372
    /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1373
     * Ensures that loads before the fence will not be reordered with loads and
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1374
     * stores after the fence.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1375
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1376
     * @apiNote Ignoring the many semantic differences from C and C++, this
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1377
     * method has memory ordering effects compatible with
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1378
     * {@code atomic_thread_fence(memory_order_acquire)}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1379
     */
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1380
    @ForceInline
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1381
    public static void acquireFence() {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1382
        UNSAFE.loadFence();
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1383
    }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1384
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1385
    /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1386
     * Ensures that loads and stores before the fence will not be
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1387
     * reordered with stores after the fence.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1388
     *
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1389
     * @apiNote Ignoring the many semantic differences from C and C++, this
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1390
     * method has memory ordering effects compatible with
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1391
     * {@code atomic_thread_fence(memory_order_release)}
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1392
     */
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1393
    @ForceInline
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1394
    public static void releaseFence() {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1395
        UNSAFE.storeFence();
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1396
    }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1397
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1398
    /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1399
     * Ensures that loads before the fence will not be reordered with
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1400
     * loads after the fence.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1401
     */
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1402
    @ForceInline
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1403
    public static void loadLoadFence() {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1404
        UNSAFE.loadLoadFence();
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1405
    }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1406
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1407
    /**
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1408
     * Ensures that stores before the fence will not be reordered with
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1409
     * stores after the fence.
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1410
     */
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1411
    @ForceInline
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1412
    public static void storeStoreFence() {
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1413
        UNSAFE.storeStoreFence();
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1414
    }
590fc47a0aeb 8149644: Integrate VarHandles
psandoz
parents:
diff changeset
  1415
}