Spec-Zone.ru › OpenJDK 17

Класс VarHandle

java.lang.Object
java.lang.invoke.VarHandle
Все реализованные интерфейсы:
Constable
public abstract class VarHandle extends Object implements Constable
VarHandle — это динамически строго типизированная ссылка на переменную или параметрически определённую группу переменных, включая статические поля, нестатические поля, элементы массивов или компоненты внекусочной структуры данных. Доступ к таким переменным поддерживается различными режимами доступа, включая обычный чтение/запись, чтение/запись volatile и сравнение с заменой.

VarHandle неизменны и не имеют видимого состояния. VarHandle не могут быть подклассифицированы пользователем.

VarHandle имеет:

  • тип variable type T, тип каждой переменной, на которую ссылается данный VarHandle; и
  • список coordinate types CT1, CT2, ..., CTn, типы координатных выражений, которые совместно определяют расположение переменной, на которую ссылается данный VarHandle.
Типы переменных и координат могут быть примитивными или ссылочными и представлены объектами Class. Список типов координат может быть пустым.

Методы-фабрики, которые создают или lookup экземпляры VarHandle, документируют поддерживаемый тип переменной и список типов координат.

Каждый режим доступа связан с одним методом режима доступа, полиморфным по сигнатуре методом, названным в соответствии с режимом доступа. При вызове метода режима доступа на экземпляре VarHandle начальные аргументы вызова — координатные выражения, которые точно указывают, в каком объекте должна быть обработана переменная. Конечные аргументы вызова представляют значения, важные для режима доступа. Например, различные режимы доступа сравнение-с-заменой или сравнение-с-обменом требуют двух конечных аргументов: ожидаемого значения переменной и нового значения.

Арность и типы аргументов вызова метода режима доступа не проверяются статически. Вместо этого каждый метод режима доступа указывает access mode type, представленный как экземпляр MethodType, который служит своего рода сигнатурой метода, по которой динамически проверяются аргументы. Тип режима доступа задаёт формальные типы параметров с учётом типов координат экземпляра VarHandle и типов значений, важных для режима доступа. Тип режима доступа также задаёт тип возвращаемого значения, часто в терминах типа переменной экземпляра VarHandle. При вызове метода режима доступа на экземпляре VarHandle символическое описание типа в месте вызова, фактические типы аргументов вызова и фактический тип возвращаемого значения должны совпадать с типами, заданными в типе режима доступа. Если совпадение не выполняется, будет брошено исключение времени выполнения. Например, метод режима доступа compareAndSet(java.lang.Object...) указывает, что если его получатель — экземпляр VarHandle с типами координат CT1, ..., CTn и типом переменной T, то его тип режима доступа — (CT1 c1, ..., CTn cn, T expectedValue, T newValue)boolean. Предположим, что экземпляр VarHandle может обращаться к элементам массива, и что его типы координат — String[] и int, а тип переменной — String. Тип режима доступа для compareAndSet в этом экземпляре VarHandle будет (String[] c1, int c2, String expectedValue, String newValue)boolean. Такой экземпляр VarHandle может быть создан с помощью array factory method и обращаться к элементам массива следующим образом:

 
 String[] sa = ...
 VarHandle avh = MethodHandles.arrayElementVarHandle(String[].class);
 boolean r = avh.compareAndSet(sa, 10, "expected", "new");
 

Режимы доступа контролируют атомарность и свойства согласованности. Обычные чтение (get) и запись (set) гарантируют битовую атомарность только для ссылок и для примитивных значений не более 32 бит и не налагают наблюдаемых ограничений порядка относительно других потоков, кроме выполняемого потока. Непрозрачные операции атомарны по битам и согласованно упорядочены относительно обращений к той же переменной. В дополнение к соблюдению свойств непрозрачности, Режим приобретения чтения и последующие обращения упорядочены после соответствующих Режим выпуска записей и их предыдущих обращений. В дополнение к соблюдению свойств приобретения и выпуска, все операции Volatile полностью упорядочены относительно друг друга.

Режимы доступа сгруппированы в следующие категории:

  • Режимы чтения, которые получают значение переменной с учётом указанных эффектов упорядочения памяти. Множество соответствующих методов режима доступа в этой группе состоит из методов get, getVolatile, getAcquire, getOpaque.
  • Режимы записи, которые устанавливают значение переменной с учётом указанных эффектов упорядочения памяти. Множество соответствующих методов режима доступа в этой группе состоит из методов set, setVolatile, setRelease, setOpaque.
  • Атомарные режимы обновления, которые, например, атомарно сравнивают и устанавливают значение переменной с учётом указанных эффектов упорядочения памяти. Множество соответствующих методов режима доступа в этой группе состоит из методов compareAndSet, weakCompareAndSetPlain, weakCompareAndSet, weakCompareAndSetAcquire, weakCompareAndSetRelease, compareAndExchangeAcquire, compareAndExchange, compareAndExchangeRelease, getAndSet, getAndSetAcquire, getAndSetRelease.
  • Числовые атомарные режимы обновления, которые, например, атомарно получают и устанавливают с добавлением значения переменной с учётом указанных эффектов упорядочения памяти. Множество соответствующих методов режима доступа в этой группе состоит из методов getAndAdd, getAndAddAcquire, getAndAddRelease.
  • Битовые атомарные режимы обновления, которые, например, атомарно получают и побитово ИЛИ значение переменной с учётом указанных эффектов упорядочения памяти. Множество соответствующих методов режима доступа в этой группе состоит из методов getAndBitwiseOr, getAndBitwiseOrAcquire, getAndBitwiseOrRelease, getAndBitwiseAnd, getAndBitwiseAndAcquire, getAndBitwiseAndRelease, getAndBitwiseXor, getAndBitwiseXorAcquire, getAndBitwiseXorRelease.

Методы-фабрики, которые создают или lookup экземпляры VarHandle, документируют набор поддерживаемых режимов доступа, который также может включать документирование ограничений, основанных на типе переменной и том, является ли переменная только для чтения. Если режим доступа не поддерживается, то соответствующий метод режима доступа при вызове бросит UnsupportedOperationException. Методы-фабрики должны документировать любые дополнительные не объявленные исключения, которые могут быть брошены методами режима доступа. Режим доступа get поддерживается для всех экземпляров VarHandle, и соответствующий метод никогда не бросает UnsupportedOperationException. Если VarHandle ссылается на переменную только для чтения (например, поле final ), то режимы записи, атомарного обновления, числового атомарного обновления и битового атомарного обновления не поддерживаются, и соответствующие методы бросают UnsupportedOperationException. Режимы чтения/записи (если поддерживаются), за исключением get и set, обеспечивают атомарный доступ для ссылочных типов и всех примитивных типов. Если в документации метода-фабрики не указано иное, режимы доступа get и set (если поддерживаются) обеспечивают атомарный доступ для ссылочных типов и всех примитивных типов, за исключением long и double на 32-битных платформах.

Режимы доступа переопределяют любые эффекты упорядочения памяти, указанные в месте объявления переменной. Например, VarHandle, обращающийся к полю с помощью режима доступа get, будет обращаться к полю, как это указано режимом доступа, даже если это поле объявлено volatile. При смешанном доступе следует проявлять особую осторожность, поскольку Модель памяти Java может допускать неожиданные результаты.

Помимо поддержки доступа к переменным в различных режимах доступа, также предоставляется набор статических методов, называемых методами барьеров памяти, для тонкого управления упорядочением памяти. Спецификация языка Java допускает, чтобы другие потоки наблюдали операции так, как будто они выполнялись в порядке, отличном от того, что видно в исходном коде программы, с ограничениями, возникающими, например, из-за использования блокировок, полей volatile или VarHandle. Статические методы fullFence, acquireFence, releaseFence, loadLoadFence и storeStoreFence также могут использоваться для наложения ограничений. Их спецификации, как и в случае с определёнными режимами доступа, сформулированы в терминах отсутствия «переупорядочений» — наблюдаемых эффектов упорядочения, которые могут произойти, если барьер отсутствует. Более точная формулировка спецификации методов режима доступа и методов барьеров памяти может сопровождать будущие обновления спецификации языка Java.

Компиляция вызова методов режима доступа

A Java method call expression naming an access mode method can invoke a VarHandle from Java source code. From the viewpoint of source code, these methods can take any arguments and their polymorphic result (if expressed) can be cast to any return type. Formally this is accomplished by giving the access mode methods variable arity Object arguments and Object return types (if the return type is polymorphic), but they have an additional quality called signature polymorphism which connects this freedom of invocation directly to the JVM execution stack.

As is usual with virtual methods, source-level calls to access mode methods compile to an invokevirtual instruction. More unusually, the compiler must record the actual argument types, and may not perform method invocation conversions on the arguments. Instead, it must generate instructions to push them on the stack according to their own unconverted types. The VarHandle object itself will be pushed on the stack before the arguments. The compiler then generates an invokevirtual instruction that invokes the access mode method with a symbolic type descriptor which describes the argument and return types.

To issue a complete symbolic type descriptor, the compiler must also determine the return type (if polymorphic). This is based on a cast on the method invocation expression, if there is one, or else Object if the invocation is an expression, or else void if the invocation is a statement. The cast may be to a primitive type (but not void).

As a corner case, an uncasted null argument is given a symbolic type descriptor of java.lang.Void. The ambiguity with the type Void is harmless, since there are no references of type Void except the null reference.

Выполнение вызова методов доступа

The first time an invokevirtual instruction is executed it is linked by symbolically resolving the names in the instruction and verifying that the method call is statically legal. This also holds for calls to access mode methods. In this case, the symbolic type descriptor emitted by the compiler is checked for correct syntax, and names it contains are resolved. Thus, an invokevirtual instruction which invokes an access mode method will always link, as long as the symbolic type descriptor is syntactically well-formed and the types exist.

When the invokevirtual is executed after linking, the receiving VarHandle's access mode type is first checked by the JVM to ensure that it matches the symbolic type descriptor. If the type match fails, it means that the access mode method which the caller is invoking is not present on the individual VarHandle being invoked.

Вызов метода доступа ведет себя по умолчанию как вызов MethodHandle.invoke(java.lang.Object...), где получающий метод-обработчик принимает экземпляр VarHandle в качестве ведущего аргумента. Более конкретно, следующее, где {access-mode} соответствует имени метода доступа:

 
 VarHandle vh = ..
 R r = (R) vh.{access-mode}(p1, p2, ..., pN);
 
ведет себя как:
 
 VarHandle vh = ..
 VarHandle.AccessMode am = VarHandle.AccessMode.valueFromMethodName("{access-mode}");
 MethodHandle mh = MethodHandles.varHandleExactInvoker(
                       am,
                       vh.accessModeType(am));

 R r = (R) mh.invoke(vh, p1, p2, ..., pN)
 
(за исключением того, что методы доступа не объявляют о выбрасывании Throwable). Это эквивалентно:
 
 MethodHandle mh = MethodHandles.lookup().findVirtual(
                       VarHandle.class,
                       "{access-mode}",
                       MethodType.methodType(R, p1, p2, ..., pN));

 R r = (R) mh.invokeExact(vh, p1, p2, ..., pN)
 
где желаемый тип метода — это символический тип описателя, и выполняется MethodHandle.invokeExact(java.lang.Object...), поскольку перед вызовом целевого объекта обработчик применит необходимые преобразования ссылок и упакует/распакует или расширит примитивные значения, как если бы это было сделано с помощью asType (см. также MethodHandles.varHandleInvoker(java.lang.invoke.VarHandle.AccessMode, java.lang.invoke.MethodType)). Более кратко, такое поведение эквивалентно:
 
 VarHandle vh = ..
 VarHandle.AccessMode am = VarHandle.AccessMode.valueFromMethodName("{access-mode}");
 MethodHandle mh = vh.toMethodHandle(am);

 R r = (R) mh.invoke(p1, p2, ..., pN)
 
где в этом случае метод-обработчик привязан к экземпляру VarHandle.

Поведение вызова VarHandle может быть скорректировано (см. withInvokeExactBehavior()) таким образом, что вызов метода доступа ведет себя как вызов MethodHandle.invokeExact(java.lang.Object...), где получающий метод-обработчик принимает экземпляр VarHandle в качестве ведущего аргумента. Более конкретно, следующее, где {access-mode} соответствует имени метода доступа:

 
 VarHandle vh = ..
 R r = (R) vh.{access-mode}(p1, p2, ..., pN);
 
ведет себя как:
 
 VarHandle vh = ..
 VarHandle.AccessMode am = VarHandle.AccessMode.valueFromMethodName("{access-mode}");
 MethodHandle mh = MethodHandles.varHandleExactInvoker(
                       am,
                       vh.accessModeType(am));

 R r = (R) mh.invokeExact(vh, p1, p2, ..., pN)
 
(за исключением того, что методы доступа не объявляют о выбрасывании Throwable). Более кратко, такое поведение эквивалентно:
 
 VarHandle vh = ..
 VarHandle.AccessMode am = VarHandle.AccessMode.valueFromMethodName("{access-mode}");
 MethodHandle mh = vh.toMethodHandle(am);

 R r = (R) mh.invokeExact(p1, p2, ..., pN)
 
где в этом случае метод-обработчик привязан к экземпляру VarHandle.

Проверка вызова

В типичных программах соответствие типов доступа VarHandle обычно проходит успешно. Но если соответствие не найдено, JVM выбросит исключение WrongMethodTypeException.

Таким образом, несоответствие типа доступа, которое может проявляться как ошибка связи в статически типизированной программе, может проявляться как динамическая WrongMethodTypeException в программе, использующей VarHandles.

Поскольку типы доступа VarHandle содержат "живые" Class объекты, соответствие типов методов учитывает как имена типов, так и загрузчики классов. Таким образом, даже если VarHandle VH создан в одном загрузчике классов L1 и используется в другом L2, вызовы методов доступа VarHandle являются типобезопасными, поскольку символический тип описателя вызывающего объекта, как разрешенного в L2, сопоставляется с исходным символическим типом описателя метода вызываемого объекта, как разрешенного в L1. Разрешение в L1 происходит при создании VH и присвоении его типов доступа, в то время как разрешение в L2 происходит при связывании инструкции invokevirtual.

Помимо проверок описателей типов, возможности VarHandles для доступа к переменным не ограничены. Если VarHandle сформирован на непубличной переменной классом, у которого есть доступ к этой переменной, полученный VarHandle может быть использован в любом месте любым вызывающим объектом, который получает ссылку на него.

В отличие от API Core Reflection, где проверка доступа выполняется каждый раз при вызове рефлексивного метода, проверка доступа VarHandle выполняется при создании VarHandle. Таким образом, VarHandles к непубличным переменным или переменным в непубличных классах обычно следует держать в секрете. Их не следует передавать ненадежному коду, если их использование ненадежным кодом не будет безопасно.

Создание VarHandle

Код Java может создать VarHandle, который напрямую обращается к любому полю, доступному для этого кода. Это делается через рефлексивный, основанный на возможностях API, называемый MethodHandles.Lookup. Например, VarHandle для нестатического поля можно получить из Lookup.findVarHandle. Также существует метод преобразования из объектов API Core Reflection, Lookup.unreflectVarHandle.

Доступ к защищенным членам поля ограничен только получающими объектами класса, осуществляющего доступ, или одним из его подклассов, и сам доступный класс должен, в свою очередь, быть подклассом (или пакетом-близнецом) определяющего класса защищенного члена. Если VarHandle ссылается на защищенное нестатическое поле класса объявления вне текущего пакета, аргумент получателя будет сужен до типа класса доступа.

Взаимодействие между VarHandles и API Core Reflection

Используя методы-фабрики в API Lookup, любое поле, представленное объектом API Core Reflection, может быть преобразовано в поведенчески эквивалентный VarHandle. Например, рефлексивный Field может быть преобразован в VarHandle с помощью Lookup.unreflectVarHandle. Полученные VarHandles, как правило, обеспечивают более прямой и эффективный доступ к основным полям.

В качестве специального случая, когда API Core Reflection используется для просмотра методов доступа со свойством полиморфизма сигнатуры в этом классе, они отображаются как обычные неполиморфные методы. Их рефлексивный вид, как просматривается с помощью Class.getDeclaredMethod, не зависит от их специального статуса в данном API. Например, Method.getModifiers сообщит ровно те биты модификатора, которые необходимы для любого аналогично объявленного метода, включая в данном случае биты native и varargs.

Как и любой отраженный метод, эти методы (при отражении) могут быть вызваны непосредственно с помощью java.lang.reflect.Method.invoke, через JNI или косвенно с помощью Lookup.unreflect. Однако такие рефлексивные вызовы не приводят к вызовам методов доступа. Такой вызов, если ему передали необходимый аргумент (один, типа Object[]), проигнорирует его и выбросит исключение UnsupportedOperationException.

Поскольку invokevirtual инструкции могут напрямую вызывать методы доступа VarHandle при любом символическом описателе типа, этот рефлексивный вид конфликтует с обычным представлением этих методов через байткоды. Таким образом, эти нативные методы, при рефлексивном просмотре с помощью Class.getDeclaredMethod, могут рассматриваться только как заглушки.

Для получения метода вызывающего объекта для определенного типа доступа используйте MethodHandles.varHandleExactInvoker(java.lang.invoke.VarHandle.AccessMode, java.lang.invoke.MethodType) или MethodHandles.varHandleInvoker(java.lang.invoke.VarHandle.AccessMode, java.lang.invoke.MethodType). API Lookup.findVirtual также может вернуть метод-обработчик для вызова метода доступа для любого указанного типа доступа и эквивалентен по поведению MethodHandles.varHandleInvoker(java.lang.invoke.VarHandle.AccessMode, java.lang.invoke.MethodType).

Взаимодействие между VarHandles и дженериками Java

VarHandle можно получить для переменной, такой как поле, которое объявлено с использованием дженериков Java. Как и в API Core Reflection, тип переменной VarHandle будет построен из стирания типа на уровне источника. Когда вызывается метод доступа VarHandle, типы его аргументов или тип возвращаемого значения могут быть дженериками или экземплярами типов. Если это произойдет, компилятор заменит эти типы их стираниями при построении символического описателя типа для invokevirtual инструкции.
Since:
9
See Also:
  • MethodHandle
  • MethodHandles
  • MethodType

Краткое описание вложенных классов

Modifier and Type Class Описание
static enum  VarHandle.AccessMode
Набор режимов доступа, которые определяют, как переменная, на которую ссылается VarHandle, доступна.
static final class  VarHandle.VarHandleDesc
Номинальный дескриптор номинальный дескриптор для константы VarHandle.

Краткое описание методов

Модификатор и тип Метод Описание
final MethodType accessModeType(VarHandle.AccessMode accessMode)
Получает тип режима доступа для этого VarHandle и заданного режима доступа.
static void acquireFence()
Гарантирует, что загрузки перед ограждением не будут переупорядочены с загрузками и сохранениями после ограждения.
final Object compareAndExchange(Object... args)
Атомарно устанавливает значение переменной в newValue с семантикой памяти setVolatile(java.lang.Object...), если текущее значение переменной, называемое значением-свидетелем, == expectedValue, как доступно с семантикой памяти getVolatile(java.lang.Object...).
final Object compareAndExchangeAcquire(Object... args)
Атомарно устанавливает значение переменной в newValue с семантикой памяти set(java.lang.Object...), если текущее значение переменной, называемое значением-свидетелем, == expectedValue, как доступно с семантикой памяти getAcquire(java.lang.Object...).
final Object compareAndExchangeRelease(Object... args)
Атомарно устанавливает значение переменной в newValue с семантикой памяти setRelease(java.lang.Object...), если текущее значение переменной, называемое значением-свидетелем, == expectedValue, как доступно с семантикой памяти get(java.lang.Object...).
final boolean compareAndSet(Object... args)
Атомарно устанавливает значение переменной в newValue с семантикой памяти setVolatile(java.lang.Object...), если текущее значение переменной, называемое значением-свидетелем, == expectedValue, как доступно с семантикой памяти getVolatile(java.lang.Object...).
List<Class<?>> coordinateTypes()
Возвращает типы координат для этого VarHandle.
Optional<VarHandle.VarHandleDesc> describeConstable()
Возвращает номинальный дескриптор для этого экземпляра, если его можно построить, или пустой Optional, если нет.
static void fullFence()
Гарантирует, что загрузки и сохранения перед ограждением не будут переупорядочены с загрузками и сохранениями после ограждения.
final Object get(Object... args)
Возвращает значение переменной с семантикой памяти чтения, как если бы переменная была объявлена не-volatile.
final Object getAcquire(Object... args)
Возвращает значение переменной и гарантирует, что последующие загрузки и сохранения не будут переупорядочены перед этим доступом.
final Object getAndAdd(Object... args)
Атомарно добавляет value к текущему значению переменной с семантикой памяти setVolatile(java.lang.Object...) и возвращает предыдущее значение переменной, как доступно с семантикой памяти getVolatile(java.lang.Object...).
final Object getAndAddAcquire(Object... args)
Атомарно добавляет value к текущему значению переменной с семантикой памяти set(java.lang.Object...) и возвращает предыдущее значение переменной, как доступно с семантикой памяти getAcquire(java.lang.Object...).
final Object getAndAddRelease(Object... args)
Атомарно добавляет value к текущему значению переменной с семантикой памяти setRelease(java.lang.Object...) и возвращает предыдущее значение переменной, как доступно с семантикой памяти get(java.lang.Object...).
final Object getAndBitwiseAnd(Object... args)
Атомарно устанавливает значение переменной в результат побитового И между текущим значением переменной и mask с семантикой памяти setVolatile(java.lang.Object...) и возвращает предыдущее значение переменной, как доступно с семантикой памяти getVolatile(java.lang.Object...).
final Object getAndBitwiseAndAcquire(Object... args)
Атомарно устанавливает значение переменной в результат побитового И между текущим значением переменной и mask с семантикой памяти set(java.lang.Object...) и возвращает предыдущее значение переменной, как доступно с семантикой памяти getAcquire(java.lang.Object...).
final Object getAndBitwiseAndRelease(Object... args)
Атомарно устанавливает значение переменной в результат побитового И между текущим значением переменной и mask с семантикой памяти setRelease(java.lang.Object...) и возвращает предыдущее значение переменной, как доступно с семантикой памяти get(java.lang.Object...).
final Object getAndBitwiseOr(Object... args)
Атомарно устанавливает значение переменной в результат побитового ИЛИ между текущим значением переменной и mask с семантикой памяти setVolatile(java.lang.Object...) и возвращает предыдущее значение переменной, как доступно с семантикой памяти getVolatile(java.lang.Object...).
final Object getAndBitwiseOrAcquire(Object... args)
Атомарно устанавливает значение переменной в результат побитового ИЛИ между текущим значением переменной и mask с семантикой памяти set(java.lang.Object...) и возвращает предыдущее значение переменной, как доступно с семантикой памяти getAcquire(java.lang.Object...).
final Object getAndBitwiseOrRelease(Object... args)
Атомарно устанавливает значение переменной в результат побитового ИЛИ между текущим значением переменной и mask с семантикой памяти setRelease(java.lang.Object...) и возвращает предыдущее значение переменной, как доступно с семантикой памяти get(java.lang.Object...).
final Object getAndBitwiseXor(Object... args)
Атомарно устанавливает значение переменной в результат побитового XOR между текущим значением переменной и mask с семантикой памяти setVolatile(java.lang.Object...) и возвращает предыдущее значение переменной, как доступно с семантикой памяти getVolatile(java.lang.Object...).
final Object getAndBitwiseXorAcquire(Object... args)
Атомарно устанавливает значение переменной в результат побитового XOR между текущим значением переменной и mask с семантикой памяти set(java.lang.Object...) и возвращает предыдущее значение переменной, как доступно с семантикой памяти getAcquire(java.lang.Object...).
final Object getAndBitwiseXorRelease(Object... args)
Атомарно устанавливает значение переменной в результат побитового XOR между текущим значением переменной и mask с семантикой памяти setRelease(java.lang.Object...) и возвращает предыдущее значение переменной, как доступно с семантикой памяти get(java.lang.Object...).
final Object getAndSet(Object... args)
Атомарно устанавливает значение переменной в newValue с семантикой памяти setVolatile(java.lang.Object...) и возвращает предыдущее значение переменной, как доступно с семантикой памяти getVolatile(java.lang.Object...).
final Object getAndSetAcquire(Object... args)
Атомарно устанавливает значение переменной в newValue с семантикой памяти set(java.lang.Object...) и возвращает предыдущее значение переменной, как доступно с семантикой памяти getAcquire(java.lang.Object...).
final Object getAndSetRelease(Object... args)
Атомарно устанавливает значение переменной в newValue с семантикой памяти setRelease(java.lang.Object...) и возвращает предыдущее значение переменной, как доступно с семантикой памяти get(java.lang.Object...).
final Object getOpaque(Object... args)
Возвращает значение переменной, доступное в порядке выполнения программы, но без гарантии эффектов упорядочивания памяти по отношению к другим потокам.
final Object getVolatile(Object... args)
Возвращает значение переменной, с семантикой памяти чтения как если бы переменная была объявлена volatile.
boolean hasInvokeExactBehavior()
Возвращает true если у этого VarHandle есть исполнение с точным поведением.
final boolean isAccessModeSupported(VarHandle.AccessMode accessMode)
Возвращает true если заданный режим доступа поддерживается, иначе false.
static void loadLoadFence()
Обеспечивает, что загрузки перед барьером не будут переупорядочены с загрузками после барьера.
static void releaseFence()
Обеспечивает, что загрузки и сохранения перед барьером не будут переупорядочены с сохранениями после барьера.
final void set(Object... args)
Устанавливает значение переменной в newValue, с семантикой установки, как если бы переменная была объявлена как не-volatile и не-final.
final void setOpaque(Object... args)
Устанавливает значение переменной в newValue, в порядке программы, но без гарантий влияния на порядок памяти относительно других потоков.
final void setRelease(Object... args)
Устанавливает значение переменной в newValue, и гарантирует, что предыдущие загрузки и сохранения не будут переупорядочены после этого доступа.
final void setVolatile(Object... args)
Устанавливает значение переменной в newValue, с семантикой установки как если бы переменная была объявлена volatile.
static void storeStoreFence()
Обеспечивает, что сохранения перед барьером не будут переупорядочены с сохранениями после барьера.
MethodHandle toMethodHandle(VarHandle.AccessMode accessMode)
Получает обработчик метода, связанный с этим VarHandle и заданным режимом доступа.
final String toString()
Возвращает компактное текстовое описание этого VarHandle, включая тип описываемой переменной и описание её координат.
Class<?> varType()
Возвращает тип переменной, к которой ссылается этот VarHandle.
final boolean weakCompareAndSet(Object... args)
Возможно атомарно устанавливает значение переменной в newValue с семантикой памяти setVolatile(java.lang.Object...) если текущее значение переменной, называемое свидетельским значением, == expectedValue, как доступно с семантикой памяти getVolatile(java.lang.Object...).
final boolean weakCompareAndSetAcquire(Object... args)
Возможно атомарно устанавливает значение переменной в newValue со семантикой set(java.lang.Object...) если текущее значение переменной, называемое свидетельским значением, == expectedValue, как доступно с семантикой памяти getAcquire(java.lang.Object...).
final boolean weakCompareAndSetPlain(Object... args)
Возможно атомарно устанавливает значение переменной в newValue со семантикой set(java.lang.Object...) если текущее значение переменной, называемое свидетельским значением, == expectedValue, как доступно с семантикой памяти get(java.lang.Object...).
final boolean weakCompareAndSetRelease(Object... args)
Возможно атомарно устанавливает значение переменной в newValue со семантикой setRelease(java.lang.Object...) если текущее значение переменной, называемое свидетельским значением, == expectedValue, как доступно с семантикой памяти get(java.lang.Object...).
abstract VarHandle withInvokeBehavior()
Возвращает VarHandle, с доступом к тем же переменным, что и этот VarHandle, но с поведением вызова методов режима доступа, настроенным на поведение вызова.
abstract VarHandle withInvokeExactBehavior()
Возвращает VarHandle, с доступом к тем же переменным, что и этот VarHandle, но с поведением вызова методов режима доступа, настроенным на исполнение с точным поведением.

Методы, объявленные в классе java.lang.Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait

Подробное описание методов

hasInvokeExactBehavior

public boolean hasInvokeExactBehavior()
Возвращает true , если у этого VarHandle есть поведение invoke-exact.
Возвращает:
true , если у этого VarHandle есть поведение invoke-exact.
С:
16
См. также:
  • withInvokeExactBehavior()
  • withInvokeBehavior()

get

public final Object get(Object... args)
Возвращает значение переменной с семантикой памяти чтения, как если бы переменная была объявлена не-volatile. Обычно называется прямым чтением.

Подпись метода имеет вид (CT1 ct1, ..., CTn ctn)T.

Символьный тип описателя в месте вызова get должен соответствовать типу доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.GET) для этого VarHandle.

Этот режим доступа поддерживается всеми экземплярами VarHandle и никогда не выбрасывает UnsupportedOperationException.

Параметры:
args - список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn), статически представленный с помощью varargs.
Возвращает:
результат с полиморфной сигнатурой, который является значением переменной, статически представленный с помощью Object.
Исключения:
WrongMethodTypeException - если тип режима доступа не соответствует символьному типу описателю вызывающего.
ClassCastException - если тип режима доступа соответствует символьному типу описателю вызывающего, но преобразование ссылки завершается неудачей.

set

public final void set(Object... args)
Устанавливает значение переменной в newValue, с семантикой памяти записи, как если бы переменная была объявлена не-volatile и не-final. Обычно называется прямым записью.

Подпись метода имеет вид (CT1 ct1, ..., CTn ctn, T newValue)void

Символьный тип описателя в месте вызова set должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.SET) для этого VarHandle.

Параметры:
args - список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn, T newValue), статически представленный с помощью varargs.
Исключения:
UnsupportedOperationException - если режим доступа не поддерживается для этого VarHandle.
WrongMethodTypeException - если тип режима доступа не соответствует символьному типу описателю вызывающего.
ClassCastException - если тип режима доступа соответствует символьному типу описателю вызывающего, но преобразование ссылки завершается неудачей.

getVolatile

public final Object getVolatile(Object... args)
Возвращает значение переменной с семантикой памяти чтения, как если бы переменная была объявлена volatile.

Подпись метода имеет вид (CT1 ct1, ..., CTn ctn)T.

Символьный тип описателя в месте вызова getVolatile должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.GET_VOLATILE) для этого VarHandle.

Параметры:
args - список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn), статически представленный с помощью varargs.
Возвращает:
результат с полиморфной сигнатурой, который является значением переменной, статически представленный с помощью Object.
Исключения:
UnsupportedOperationException - если режим доступа не поддерживается для этого VarHandle.
WrongMethodTypeException - если тип режима доступа не соответствует символьному типу описателю вызывающего.
ClassCastException - если тип режима доступа соответствует символьному типу описателю вызывающего, но преобразование ссылки завершается неудачей.

setVolatile

public final void setVolatile(Object... args)
Устанавливает значение переменной в newValue, с семантикой памяти записи, как если бы переменная была объявлена volatile.

Подпись метода имеет вид (CT1 ct1, ..., CTn ctn, T newValue)void.

Символьный тип описателя в месте вызова setVolatile должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.SET_VOLATILE) для этого VarHandle.

Примечание API:
Игнорируя множество семантических различий с C и C++, этот метод имеет эффекты упорядочивания памяти, совместимые с memory_order_seq_cst.
Параметры:
args - список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn, T newValue), статически представленный с помощью varargs.
Исключения:
UnsupportedOperationException - если режим доступа не поддерживается для этого VarHandle.
WrongMethodTypeException - если тип режима доступа не соответствует символьному типу описателю вызывающего.
ClassCastException - если тип режима доступа соответствует символьному типу описателю вызывающего, но преобразование ссылки завершается неудачей.

getOpaque

public final Object getOpaque(Object... args)
Возвращает значение переменной, доступ к которой осуществляется в порядке выполнения программы, но без гарантии эффектов упорядочивания памяти по отношению к другим потокам.

Подпись метода имеет вид (CT1 ct1, ..., CTn ctn)T.

Символьный тип описателя в месте вызова getOpaque должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.GET_OPAQUE) для этого VarHandle.

Параметры:
args - список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn), статически представленный с помощью varargs.
Возвращает:
результат с полиморфной сигнатурой, который является значением переменной, статически представленный с помощью Object.
Исключения:
UnsupportedOperationException - если режим доступа не поддерживается для этого VarHandle.
WrongMethodTypeException - если тип режима доступа не соответствует символьному типу описателю вызывающего.
ClassCastException - если тип режима доступа соответствует символьному типу описателю вызывающего, но преобразование ссылки завершается неудачей.

setOpaque

public final void setOpaque(Object... args)
Устанавливает значение переменной в newValue, в порядке выполнения программы, но без гарантии эффектов упорядочивания памяти по отношению к другим потокам.

Подпись метода имеет вид (CT1 ct1, ..., CTn ctn, T newValue)void.

Символьный тип описателя в месте вызова setOpaque должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.SET_OPAQUE) для этого VarHandle.

Параметры:
args - список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn, T newValue), статически представленный с помощью varargs.
Исключения:
UnsupportedOperationException - если режим доступа не поддерживается для этого VarHandle.
WrongMethodTypeException - если тип режима доступа не соответствует символьному типу описателю вызывающего.
ClassCastException - если тип режима доступа соответствует символьному типу описателю вызывающего, но преобразование ссылки завершается неудачей.

getAcquire

public final Object getAcquire(Object... args)
Возвращает значение переменной и гарантирует, что последующие загрузки и сохранения не будут переупорядочены перед этим доступом.

Подпись метода имеет вид (CT1 ct1, ..., CTn ctn)T.

Символьный тип описателя в месте вызова getAcquire должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.GET_ACQUIRE) для этого VarHandle.

Примечание API:
Игнорируя множество семантических различий с C и C++, этот метод имеет эффекты упорядочивания памяти, совместимые с memory_order_acquire упорядочиванием.
Параметры:
args - список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn), статически представленный с помощью varargs.
Возвращает:
результат с полиморфной сигнатурой, который является значением переменной, статически представленный с помощью Object.
Исключения:
UnsupportedOperationException - если режим доступа не поддерживается для этого VarHandle.
WrongMethodTypeException - если тип режима доступа не соответствует символьному типу описателю вызывающего.
ClassCastException - если тип режима доступа соответствует символьному типу описателю вызывающего, но преобразование ссылки завершается неудачей.

setRelease

public final void setRelease(Object... args)
Устанавливает значение переменной в newValue, и гарантирует, что предыдущие загрузки и сохранения не будут переупорядочены после этого доступа.

Подпись метода имеет вид (CT1 ct1, ..., CTn ctn, T newValue)void.

Символьный тип описателя в месте вызова setRelease должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.SET_RELEASE) для этого VarHandle.

Примечание API:
Игнорируя множество семантических различий с C и C++, этот метод имеет эффекты упорядочивания памяти, совместимые с memory_order_release упорядочиванием.
Параметры:
args - список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn, T newValue), статически представленный с помощью varargs.
Исключения:
UnsupportedOperationException - если режим доступа не поддерживается для этого VarHandle.
WrongMethodTypeException - если тип режима доступа не соответствует символьному типу описателю вызывающего.
ClassCastException - если тип режима доступа соответствует символьному типу описателю вызывающего, но преобразование ссылки завершается неудачей.

compareAndSet

public final boolean compareAndSet(Object... args)
Атомарно устанавливает значение переменной на newValue с семантикой памяти setVolatile(java.lang.Object...), если текущее значение переменной, называемое свидетельским значением, == значение expectedValue, доступное с семантикой памяти getVolatile(java.lang.Object...).

Подпись метода имеет вид (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)boolean.

Символьный тип описания в месте вызова compareAndSet должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.COMPARE_AND_SET) для этого VarHandle.

Параметры:
args - список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue) , статически представленный с использованием varargs.
Возвращает:
true при успехе, иначе false , если свидетельское значение не совпадало с ожидаемым expectedValue.
Выбрасывает:
UnsupportedOperationException - если режим доступа не поддерживается для этого VarHandle.
WrongMethodTypeException - если тип режима доступа не соответствует символьному типу описания вызывающей стороны.
ClassCastException - если тип режима доступа соответствует символьному типу описания вызывающей стороны, но преобразование ссылки не удалось.
См. также:
  • setVolatile(Object...)
  • getVolatile(Object...)

compareAndExchange

public final Object compareAndExchange(Object... args)
Атомарно устанавливает значение переменной на newValue с семантикой памяти setVolatile(java.lang.Object...), если текущее значение переменной, называемое свидетельским значением, == значение expectedValue, доступное с семантикой памяти getVolatile(java.lang.Object...).

Подпись метода имеет вид (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)T.

Символьный тип описания в месте вызова compareAndExchange должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.COMPARE_AND_EXCHANGE) для этого VarHandle.

Параметры:
args - список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue) , статически представленный с использованием varargs.
Возвращает:
результат с полиморфной сигнатурой, представляющий свидетельское значение, которое будет таким же, как expectedValue при успехе, статически представленный с использованием Object.
Выбрасывает:
UnsupportedOperationException - если режим доступа не поддерживается для этого VarHandle.
WrongMethodTypeException - если тип режима доступа не совместим с символьным типом описания вызывающей стороны.
ClassCastException - если тип режима доступа совместим с символьным типом описания вызывающей стороны, но преобразование ссылки не удалось.
См. также:
  • setVolatile(Object...)
  • getVolatile(Object...)

compareAndExchangeAcquire

public final Object compareAndExchangeAcquire(Object... args)
Атомарно устанавливает значение переменной на newValue с семантикой памяти set(java.lang.Object...), если текущее значение переменной, называемое свидетельским значением, == значение expectedValue, доступное с семантикой памяти getAcquire(java.lang.Object...).

Подпись метода имеет вид (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)T.

Символьный тип описания в месте вызова compareAndExchangeAcquire должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_ACQUIRE) для этого VarHandle.

Параметры:
args - список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue) , статически представленный с использованием varargs.
Возвращает:
результат с полиморфной сигнатурой, представляющий свидетельское значение, которое будет таким же, как expectedValue при успехе, статически представленный с использованием Object.
Выбрасывает:
UnsupportedOperationException - если режим доступа не поддерживается для этого VarHandle.
WrongMethodTypeException - если тип режима доступа не соответствует символьному типу описания вызывающей стороны.
ClassCastException - если тип режима доступа соответствует символьному типу описания вызывающей стороны, но преобразование ссылки не удалось.
См. также:
  • set(Object...)
  • getAcquire(Object...)

compareAndExchangeRelease

public final Object compareAndExchangeRelease(Object... args)
Атомарно устанавливает значение переменной на newValue с семантикой памяти setRelease(java.lang.Object...), если текущее значение переменной, называемое свидетельским значением, == значение expectedValue, доступное с семантикой памяти get(java.lang.Object...).

Подпись метода имеет вид (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)T.

Символьный тип описания в месте вызова compareAndExchangeRelease должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE) для этого VarHandle.

Параметры:
args - список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue) , статически представленный с использованием varargs.
Возвращает:
результат с полиморфной сигнатурой, представляющий свидетельское значение, которое будет таким же, как expectedValue при успехе, статически представленный с использованием Object.
Выбрасывает:
UnsupportedOperationException - если режим доступа не поддерживается для этого VarHandle.
WrongMethodTypeException - если тип режима доступа не соответствует символьному типу описания вызывающей стороны.
ClassCastException - если тип режима доступа соответствует символьному типу описания вызывающей стороны, но преобразование ссылки не удалось.
См. также:
  • setRelease(Object...)
  • get(Object...)

weakCompareAndSetPlain

public final boolean weakCompareAndSetPlain(Object... args)
Возможно атомарно устанавливает значение переменной на newValue с семантикой set(java.lang.Object...), если текущее значение переменной, называемое свидетельским значением, == значение expectedValue, доступное с семантикой памяти get(java.lang.Object...).

Эта операция может неудачно завершиться (как правило, из-за конкурентного доступа к памяти), даже если свидетельское значение совпадает с ожидаемым значением.

Подпись метода имеет вид (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)boolean.

Символьный тип описания в месте вызова weakCompareAndSetPlain должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_PLAIN) для этого VarHandle.

Параметры:
args - список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue) , статически представленный с использованием varargs.
Возвращает:
true при успехе, иначе false , если свидетельское значение не совпадало с ожидаемым expectedValue или если эта операция неудачно завершилась.
Выбрасывает:
UnsupportedOperationException - если режим доступа не поддерживается для этого VarHandle.
WrongMethodTypeException - если тип режима доступа не соответствует символьному типу описания вызывающей стороны.
ClassCastException - если тип режима доступа соответствует символьному типу описания вызывающей стороны, но преобразование ссылки не удалось.
См. также:
  • set(Object...)
  • get(Object...)

weakCompareAndSet

public final boolean weakCompareAndSet(Object... args)
Возможно атомарно устанавливает значение переменной на newValue с семантикой памяти setVolatile(java.lang.Object...), если текущее значение переменной, называемое свидетельским значением, == значение expectedValue, доступное с семантикой памяти getVolatile(java.lang.Object...).

Эта операция может неудачно завершиться (как правило, из-за конкурентного доступа к памяти), даже если свидетельское значение совпадает с ожидаемым значением.

Подпись метода имеет вид (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)boolean.

Символьный тип описания в месте вызова weakCompareAndSet должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.WEAK_COMPARE_AND_SET) для этого VarHandle.

Параметры:
args - список параметров с полиморфной сигнатурой вида (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue) , статически представленный с использованием varargs.
Возвращает:
true при успехе, иначе false , если свидетельское значение не совпадало с ожидаемым expectedValue или если эта операция неудачно завершилась.
Выбрасывает:
UnsupportedOperationException - если режим доступа не поддерживается для этого VarHandle.
WrongMethodTypeException - если тип режима доступа не соответствует символьному типу описания вызывающей стороны.
ClassCastException - если тип режима доступа соответствует символьному типу описания вызывающей стороны, но преобразование ссылки не удалось.
См. также:
  • setVolatile(Object...)
  • getVolatile(Object...)

weakCompareAndSetAcquire

public final boolean weakCompareAndSetAcquire(Object... args)
Возможно атомарно устанавливает значение переменной на newValue с семантикой set(java.lang.Object...), если текущее значение переменной, называемое значением свидетеля, == expectedValue, как обращается с семантикой памяти getAcquire(java.lang.Object...).

Эта операция может случайным образом завершиться неудачей (обычно из-за конкуренции за память), даже если значение свидетеля соответствует ожидаемому значению.

Подпись метода имеет вид (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)boolean.

Символический тип описателя в месте вызова weakCompareAndSetAcquire должен совпадать с типом режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE) для этого VarHandle.

Параметры:
args - список параметров, полиморфный по сигнатуре, вида (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue) , статически представленный с помощью varargs.
Возвращает:
true при успехе, иначе false , если значение свидетеля не совпадало с expectedValue или эта операция случайно завершилась неудачей.
Исключения:
UnsupportedOperationException - если режим доступа не поддерживается этим VarHandle.
WrongMethodTypeException - если тип режима доступа не соответствует символическому описателю вызывающей стороны.
ClassCastException - если тип режима доступа соответствует символическому описателю вызывающей стороны, но преобразование ссылки не удалось.
См. также:
  • set(Object...)
  • getAcquire(Object...)

weakCompareAndSetRelease

public final boolean weakCompareAndSetRelease(Object... args)
Возможно атомарно устанавливает значение переменной на newValue с семантикой setRelease(java.lang.Object...), если текущее значение переменной, называемое значением свидетеля, == expectedValue, как обращается с семантикой памяти get(java.lang.Object...).

Эта операция может случайным образом завершиться неудачей (обычно из-за конкуренции за память), даже если значение свидетеля соответствует ожидаемому значению.

Подпись метода имеет вид (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue)boolean.

Символический тип описателя в месте вызова weakCompareAndSetRelease должен совпадать с типом режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE) для этого VarHandle.

Параметры:
args - список параметров, полиморфный по сигнатуре, вида (CT1 ct1, ..., CTn ctn, T expectedValue, T newValue) , статически представленный с помощью varargs.
Возвращает:
true при успехе, иначе false , если значение свидетеля не совпадало с expectedValue или эта операция случайно завершилась неудачей.
Исключения:
UnsupportedOperationException - если режим доступа не поддерживается этим VarHandle.
WrongMethodTypeException - если тип режима доступа не соответствует символическому описателю вызывающей стороны.
ClassCastException - если тип режима доступа соответствует символическому описателю вызывающей стороны, но преобразование ссылки не удалось.
См. также:
  • setRelease(Object...)
  • get(Object...)

getAndSet

public final Object getAndSet(Object... args)
Атомарно устанавливает значение переменной на newValue с семантикой памяти setVolatile(java.lang.Object...) и возвращает предыдущее значение переменной, как обращается с семантикой памяти getVolatile(java.lang.Object...).

Подпись метода имеет вид (CT1 ct1, ..., CTn ctn, T newValue)T.

Символический тип описателя в месте вызова getAndSet должен совпадать с типом режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.GET_AND_SET) для этого VarHandle.

Параметры:
args - список параметров, полиморфный по сигнатуре, вида (CT1 ct1, ..., CTn ctn, T newValue) , статически представленный с помощью varargs.
Возвращает:
результат, полиморфный по сигнатуре, который является предыдущим значением переменной, статически представленный с помощью Object.
Исключения:
UnsupportedOperationException - если режим доступа не поддерживается этим VarHandle.
WrongMethodTypeException - если тип режима доступа не соответствует символическому описателю вызывающей стороны.
ClassCastException - если тип режима доступа соответствует символическому описателю вызывающей стороны, но преобразование ссылки не удалось.
См. также:
  • setVolatile(Object...)
  • getVolatile(Object...)

getAndSetAcquire

public final Object getAndSetAcquire(Object... args)
Атомарно устанавливает значение переменной на newValue с семантикой памяти set(java.lang.Object...) и возвращает предыдущее значение переменной, как обращается с семантикой памяти getAcquire(java.lang.Object...).

Подпись метода имеет вид (CT1 ct1, ..., CTn ctn, T newValue)T.

Символический тип описателя в месте вызова getAndSetAcquire должен совпадать с типом режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.GET_AND_SET_ACQUIRE) для этого VarHandle.

Параметры:
args - список параметров, полиморфный по сигнатуре, вида (CT1 ct1, ..., CTn ctn, T newValue) , статически представленный с помощью varargs.
Возвращает:
результат, полиморфный по сигнатуре, который является предыдущим значением переменной, статически представленный с помощью Object.
Исключения:
UnsupportedOperationException - если режим доступа не поддерживается этим VarHandle.
WrongMethodTypeException - если тип режима доступа не соответствует символическому описателю вызывающей стороны.
ClassCastException - если тип режима доступа соответствует символическому описателю вызывающей стороны, но преобразование ссылки не удалось.
См. также:
  • setVolatile(Object...)
  • getVolatile(Object...)

getAndSetRelease

public final Object getAndSetRelease(Object... args)
Атомарно устанавливает значение переменной на newValue с семантикой памяти setRelease(java.lang.Object...) и возвращает предыдущее значение переменной, как обращается с семантикой памяти get(java.lang.Object...).

Подпись метода имеет вид (CT1 ct1, ..., CTn ctn, T newValue)T.

Символический тип описателя в месте вызова getAndSetRelease должен совпадать с типом режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.GET_AND_SET_RELEASE) для этого VarHandle.

Параметры:
args - список параметров, полиморфный по сигнатуре, вида (CT1 ct1, ..., CTn ctn, T newValue) , статически представленный с помощью varargs.
Возвращает:
результат, полиморфный по сигнатуре, который является предыдущим значением переменной, статически представленный с помощью Object.
Исключения:
UnsupportedOperationException - если режим доступа не поддерживается этим VarHandle.
WrongMethodTypeException - если тип режима доступа не соответствует символическому описателю вызывающей стороны.
ClassCastException - если тип режима доступа соответствует символическому описателю вызывающей стороны, но преобразование ссылки не удалось.
См. также:
  • setVolatile(Object...)
  • getVolatile(Object...)

getAndAdd

public final Object getAndAdd(Object... args)
Атомарно добавляет value к текущему значению переменной с семантикой памяти setVolatile(java.lang.Object...) и возвращает предыдущее значение переменной, как обращается с семантикой памяти getVolatile(java.lang.Object...).

Подпись метода имеет вид (CT1 ct1, ..., CTn ctn, T value)T.

Символический тип описателя в месте вызова getAndAdd должен совпадать с типом режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.GET_AND_ADD) для этого VarHandle.

Параметры:
args - список параметров, полиморфный по сигнатуре, вида (CT1 ct1, ..., CTn ctn, T value) , статически представленный с помощью varargs.
Возвращает:
результат, полиморфный по сигнатуре, который является предыдущим значением переменной, статически представленный с помощью Object.
Исключения:
UnsupportedOperationException - если режим доступа не поддерживается этим VarHandle.
WrongMethodTypeException - если тип режима доступа не соответствует символическому описателю вызывающей стороны.
ClassCastException - если тип режима доступа соответствует символическому описателю вызывающей стороны, но преобразование ссылки не удалось.
См. также:
  • setVolatile(Object...)
  • getVolatile(Object...)

getAndAddAcquire

public final Object getAndAddAcquire(Object... args)
Атомарно добавляет value к текущему значению переменной с семантикой памяти set(java.lang.Object...) и возвращает предыдущее значение переменной, как оно доступно с семантикой памяти getAcquire(java.lang.Object...).

Подпись метода имеет вид (CT1 ct1, ..., CTn ctn, T value)T.

Символьный тип описателя в месте вызова getAndAddAcquire должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.GET_AND_ADD_ACQUIRE) для этого VarHandle.

Параметры:
args - список параметров, полиморфный по сигнатуре, вида (CT1 ct1, ..., CTn ctn, T value), статически представленный с помощью varargs.
Возвращает:
результат полиморфной по сигнатуре вычисления, который представляет собой предыдущее значение переменной, статически представленный с помощью Object.
Исключение:
UnsupportedOperationException - если режим доступа не поддерживается для этого VarHandle.
WrongMethodTypeException - если тип режима доступа не соответствует символьному типу описателя вызывающего кода.
ClassCastException - если тип режима доступа соответствует символьному типу описателя вызывающего кода, но произошла ошибка при приведении ссылки.
См. также:
  • setVolatile(Object...)
  • getVolatile(Object...)

getAndAddRelease

public final Object getAndAddRelease(Object... args)
Атомарно добавляет value к текущему значению переменной с семантикой памяти setRelease(java.lang.Object...) и возвращает предыдущее значение переменной, как оно доступно с семантикой памяти get(java.lang.Object...).

Подпись метода имеет вид (CT1 ct1, ..., CTn ctn, T value)T.

Символьный тип описателя в месте вызова getAndAddRelease должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.GET_AND_ADD_RELEASE) для этого VarHandle.

Параметры:
args - список параметров, полиморфный по сигнатуре, вида (CT1 ct1, ..., CTn ctn, T value), статически представленный с помощью varargs.
Возвращает:
результат полиморфной по сигнатуре вычисления, который представляет собой предыдущее значение переменной, статически представленный с помощью Object.
Исключение:
UnsupportedOperationException - если режим доступа не поддерживается для этого VarHandle.
WrongMethodTypeException - если тип режима доступа не соответствует символьному типу описателя вызывающего кода.
ClassCastException - если тип режима доступа соответствует символьному типу описателя вызывающего кода, но произошла ошибка при приведении ссылки.
См. также:
  • setVolatile(Object...)
  • getVolatile(Object...)

getAndBitwiseOr

public final Object getAndBitwiseOr(Object... args)
Атомарно устанавливает значение переменной в результат побитового ИЛИ между текущим значением переменной и mask с семантикой памяти setVolatile(java.lang.Object...) и возвращает предыдущее значение переменной, как оно доступно с семантикой памяти getVolatile(java.lang.Object...).

Если тип переменной - нецелочисленный тип boolean, то выполняется логическое ИЛИ вместо побитового ИЛИ.

Подпись метода имеет вид (CT1 ct1, ..., CTn ctn, T mask)T.

Символьный тип описателя в месте вызова getAndBitwiseOr должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_OR) для этого VarHandle.

Параметры:
args - список параметров, полиморфный по сигнатуре, вида (CT1 ct1, ..., CTn ctn, T mask) , статически представленный с помощью varargs.
Возвращает:
результат полиморфной по сигнатуре вычисления, который представляет собой предыдущее значение переменной, статически представленный с помощью Object.
Исключение:
UnsupportedOperationException - если режим доступа не поддерживается для этого VarHandle.
WrongMethodTypeException - если тип режима доступа не соответствует символьному типу описателя вызывающего кода.
ClassCastException - если тип режима доступа соответствует символьному типу описателя вызывающего кода, но произошла ошибка при приведении ссылки.
См. также:
  • setVolatile(Object...)
  • getVolatile(Object...)

getAndBitwiseOrAcquire

public final Object getAndBitwiseOrAcquire(Object... args)
Атомарно устанавливает значение переменной в результат побитового ИЛИ между текущим значением переменной и mask с семантикой памяти set(java.lang.Object...) и возвращает предыдущее значение переменной, как оно доступно с семантикой памяти getAcquire(java.lang.Object...).

Если тип переменной - нецелочисленный тип boolean, то выполняется логическое ИЛИ вместо побитового ИЛИ.

Подпись метода имеет вид (CT1 ct1, ..., CTn ctn, T mask)T.

Символьный тип описателя в месте вызова getAndBitwiseOrAcquire должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_OR_ACQUIRE) для этого VarHandle.

Параметры:
args - список параметров, полиморфный по сигнатуре, вида (CT1 ct1, ..., CTn ctn, T mask), статически представленный с помощью varargs.
Возвращает:
результат полиморфной по сигнатуре вычисления, который представляет собой предыдущее значение переменной, статически представленный с помощью Object.
Исключение:
UnsupportedOperationException - если режим доступа не поддерживается для этого VarHandle.
WrongMethodTypeException - если тип режима доступа не соответствует символьному типу описателя вызывающего кода.
ClassCastException - если тип режима доступа соответствует символьному типу описателя вызывающего кода, но произошла ошибка при приведении ссылки.
См. также:
  • set(Object...)
  • getAcquire(Object...)

getAndBitwiseOrRelease

public final Object getAndBitwiseOrRelease(Object... args)
Атомарно устанавливает значение переменной в результат побитового ИЛИ между текущим значением переменной и mask с семантикой памяти setRelease(java.lang.Object...) и возвращает предыдущее значение переменной, как оно доступно с семантикой памяти get(java.lang.Object...).

Если тип переменной - нецелочисленный тип boolean, то выполняется логическое ИЛИ вместо побитового ИЛИ.

Подпись метода имеет вид (CT1 ct1, ..., CTn ctn, T mask)T.

Символьный тип описателя в месте вызова getAndBitwiseOrRelease должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_OR_RELEASE) для этого VarHandle.

Параметры:
args - список параметров, полиморфный по сигнатуре, вида (CT1 ct1, ..., CTn ctn, T mask), статически представленный с помощью varargs.
Возвращает:
результат полиморфной по сигнатуре вычисления, который представляет собой предыдущее значение переменной, статически представленный с помощью Object.
Исключение:
UnsupportedOperationException - если режим доступа не поддерживается для этого VarHandle.
WrongMethodTypeException - если тип режима доступа не соответствует символьному типу описателя вызывающего кода.
ClassCastException - если тип режима доступа соответствует символьному типу описателя вызывающего кода, но произошла ошибка при приведении ссылки.
См. также:
  • setRelease(Object...)
  • get(Object...)

getAndBitwiseAnd

public final Object getAndBitwiseAnd(Object... args)
Атомарно устанавливает значение переменной в результат побитового И между текущим значением переменной и mask с семантикой памяти setVolatile(java.lang.Object...) и возвращает предыдущее значение переменной, как оно доступно с семантикой памяти getVolatile(java.lang.Object...).

Если тип переменной - нецелочисленный тип boolean, то выполняется логическое И вместо побитового И.

Подпись метода имеет вид (CT1 ct1, ..., CTn ctn, T mask)T.

Символьный тип описателя в месте вызова getAndBitwiseAnd должен соответствовать типу режима доступа, который является результатом вызова accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_AND) для этого VarHandle.

Параметры:
args - список параметров, полиморфный по сигнатуре, вида (CT1 ct1, ..., CTn ctn, T mask), статически представленный с помощью varargs.
Возвращает:
результат полиморфной по сигнатуре вычисления, который представляет собой предыдущее значение переменной, статически представленный с помощью Object.
Исключение:
UnsupportedOperationException - если режим доступа не поддерживается для этого VarHandle.
WrongMethodTypeException - если тип режима доступа не соответствует символьному типу описателя вызывающего кода.
ClassCastException - если тип режима доступа соответствует символьному типу описателя вызывающего кода, но произошла ошибка при приведении ссылки.
См. также:
  • setVolatile(Object...)
  • getVolatile(Object...)

getAndBitwiseAndAcquire

public final Object getAndBitwiseAndAcquire(Object... args)
Атомарно устанавливает значение переменной в результат побитового И между текущим значением переменной и mask с семантикой памяти set(java.lang.Object...) и возвращает предыдущее значение переменной, доступное с семантикой памяти getAcquire(java.lang.Object...).

Если тип переменной — нецелочисленный тип boolean, то выполняется логическое И, а не побитовое И.

Подпись метода имеет вид (CT1 ct1, ..., CTn ctn, T mask)T.

Символьный тип описания в месте вызова getAndBitwiseAndAcquire должен соответствовать типу режима доступа, полученному в результате вызова accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_AND_ACQUIRE) для этого VarHandle.

Parameters:
args - список параметров с полиморфной подписью вида (CT1 ct1, ..., CTn ctn, T mask), статически представленный с помощью varargs.
Returns:
результат с полиморфной подписью, представляющий собой предыдущее значение переменной, статически представленный с помощью Object.
Throws:
UnsupportedOperationException - если режим доступа не поддерживается для этого VarHandle.
WrongMethodTypeException - если тип режима доступа не соответствует символьному типу описания вызывающего объекта.
ClassCastException - если тип режима доступа соответствует символьному типу описания вызывающего объекта, но преобразование ссылки не выполнено.
See Also:
  • set(Object...)
  • getAcquire(Object...)

getAndBitwiseAndRelease

public final Object getAndBitwiseAndRelease(Object... args)
Атомарно устанавливает значение переменной в результат побитового И между текущим значением переменной и mask с семантикой памяти setRelease(java.lang.Object...) и возвращает предыдущее значение переменной, доступное с семантикой памяти get(java.lang.Object...).

Если тип переменной — нецелочисленный тип boolean, то выполняется логическое И, а не побитовое И.

Подпись метода имеет вид (CT1 ct1, ..., CTn ctn, T mask)T.

Символьный тип описания в месте вызова getAndBitwiseAndRelease должен соответствовать типу режима доступа, полученному в результате вызова accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_AND_RELEASE) для этого VarHandle.

Parameters:
args - список параметров с полиморфной подписью вида (CT1 ct1, ..., CTn ctn, T mask), статически представленный с помощью varargs.
Returns:
результат с полиморфной подписью, представляющий собой предыдущее значение переменной, статически представленный с помощью Object.
Throws:
UnsupportedOperationException - если режим доступа не поддерживается для этого VarHandle.
WrongMethodTypeException - если тип режима доступа не соответствует символьному типу описания вызывающего объекта.
ClassCastException - если тип режима доступа соответствует символьному типу описания вызывающего объекта, но преобразование ссылки не выполнено.
See Also:
  • setRelease(Object...)
  • get(Object...)

getAndBitwiseXor

public final Object getAndBitwiseXor(Object... args)
Атомарно устанавливает значение переменной в результат побитового XOR между текущим значением переменной и mask с семантикой памяти setVolatile(java.lang.Object...) и возвращает предыдущее значение переменной, доступное с семантикой памяти getVolatile(java.lang.Object...).

Если тип переменной — нецелочисленный тип boolean, то выполняется логическое XOR, а не побитовое XOR.

Подпись метода имеет вид (CT1 ct1, ..., CTn ctn, T mask)T.

Символьный тип описания в месте вызова getAndBitwiseXor должен соответствовать типу режима доступа, полученному в результате вызова accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_XOR) для этого VarHandle.

Parameters:
args - список параметров с полиморфной подписью вида (CT1 ct1, ..., CTn ctn, T mask), статически представленный с помощью varargs.
Returns:
результат с полиморфной подписью, представляющий собой предыдущее значение переменной, статически представленный с помощью Object.
Throws:
UnsupportedOperationException - если режим доступа не поддерживается для этого VarHandle.
WrongMethodTypeException - если тип режима доступа не соответствует символьному типу описания вызывающего объекта.
ClassCastException - если тип режима доступа соответствует символьному типу описания вызывающего объекта, но преобразование ссылки не выполнено.
See Also:
  • setVolatile(Object...)
  • getVolatile(Object...)

getAndBitwiseXorAcquire

public final Object getAndBitwiseXorAcquire(Object... args)
Атомарно устанавливает значение переменной в результат побитового XOR между текущим значением переменной и mask с семантикой памяти set(java.lang.Object...) и возвращает предыдущее значение переменной, доступное с семантикой памяти getAcquire(java.lang.Object...).

Если тип переменной — нецелочисленный тип boolean, то выполняется логическое XOR, а не побитовое XOR.

Подпись метода имеет вид (CT1 ct1, ..., CTn ctn, T mask)T.

Символьный тип описания в месте вызова getAndBitwiseXorAcquire должен соответствовать типу режима доступа, полученному в результате вызова accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_XOR_ACQUIRE) для этого VarHandle.

Parameters:
args - список параметров с полиморфной подписью вида (CT1 ct1, ..., CTn ctn, T mask), статически представленный с помощью varargs.
Returns:
результат с полиморфной подписью, представляющий собой предыдущее значение переменной, статически представленный с помощью Object.
Throws:
UnsupportedOperationException - если режим доступа не поддерживается для этого VarHandle.
WrongMethodTypeException - если тип режима доступа не соответствует символьному типу описания вызывающего объекта.
ClassCastException - если тип режима доступа соответствует символьному типу описания вызывающего объекта, но преобразование ссылки не выполнено.
See Also:
  • set(Object...)
  • getAcquire(Object...)

getAndBitwiseXorRelease

public final Object getAndBitwiseXorRelease(Object... args)
Атомарно устанавливает значение переменной в результат побитового XOR между текущим значением переменной и mask с семантикой памяти setRelease(java.lang.Object...) и возвращает предыдущее значение переменной, доступное с семантикой памяти get(java.lang.Object...).

Если тип переменной — нецелочисленный тип boolean, то выполняется логическое XOR, а не побитовое XOR.

Подпись метода имеет вид (CT1 ct1, ..., CTn ctn, T mask)T.

Символьный тип описания в месте вызова getAndBitwiseXorRelease должен соответствовать типу режима доступа, полученному в результате вызова accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_XOR_RELEASE) для этого VarHandle.

Parameters:
args - список параметров с полиморфной подписью вида (CT1 ct1, ..., CTn ctn, T mask), статически представленный с помощью varargs.
Returns:
результат с полиморфной подписью, представляющий собой предыдущее значение переменной, статически представленный с помощью Object.
Throws:
UnsupportedOperationException - если режим доступа не поддерживается для этого VarHandle.
WrongMethodTypeException - если тип режима доступа не соответствует символьному типу описания вызывающего объекта.
ClassCastException - если тип режима доступа соответствует символьному типу описания вызывающего объекта, но преобразование ссылки не выполнено.
See Also:
  • setRelease(Object...)
  • get(Object...)

withInvokeExactBehavior

public abstract VarHandle withInvokeExactBehavior()
Возвращает VarHandle с доступом к тем же переменным, что и этот VarHandle, но поведение вызовов методов режима доступа изменено на поведение вызова - точно.

Если у этого VarHandle уже есть поведение вызова - точно, возвращается этот же VarHandle.

Вызов hasInvokeExactBehavior() на возвращаемом handle гарантированно вернёт true.

API Note:
Поведение вызова - точно гарантирует, что при вызове метода режима доступа типы и арность аргументов должны соответствовать access mode type, в противном случае будет брошено исключение WrongMethodTypeException.
Returns:
VarHandle с поведением вызова - точно
Since:
16
See Also:
  • withInvokeBehavior()
  • hasInvokeExactBehavior()

withInvokeBehavior

public abstract VarHandle withInvokeBehavior()
Возвращает VarHandle с доступом к тем же переменным, что и этот VarHandle, но поведение вызовов методов режима доступа изменено на поведение вызова.

Если у этого VarHandle уже есть поведение вызова, возвращается этот же VarHandle.

Вызов hasInvokeExactBehavior() на возвращаемом handle гарантированно вернёт false.

Returns:
VarHandle с поведением вызова
Since:
16
See Also:
  • withInvokeExactBehavior()
  • hasInvokeExactBehavior()

toString

public final String toString()
Возвращает компактное текстовое описание этого VarHandle, включая тип описываемой переменной и описание её координат.
Overrides:
toString в классе Object
Возвращает:
Компактное текстовое описание этого VarHandle

varType

public Class<?> varType()
Возвращает тип переменной, на которую ссылается этот VarHandle.
Возвращает:
тип переменной, на которую ссылается этот VarHandle

coordinateTypes

public List<Class<?>> coordinateTypes()
Возвращает типы координат для этого VarHandle.
Возвращает:
типы координат для этого VarHandle. Возвращаемый список неизменяемый

accessModeType

public final MethodType accessModeType(VarHandle.AccessMode accessMode)
Получает тип режима доступа для этого VarHandle и заданного режима доступа.

Параметры типа режима доступа будут состоять из префикса, представляющего типы координат этого VarHandle, за которым следуют дополнительные типы, определённые методом режима доступа. Тип возвращаемого значения режима доступа определяется типом возвращаемого значения метода режима доступа.

Параметры:
accessMode - режим доступа, соответствующий методу с тем же именем, полиморфному по сигнатуре
Возвращает:
тип режима доступа для заданного режима доступа

isAccessModeSupported

public final boolean isAccessModeSupported(VarHandle.AccessMode accessMode)
Возвращает true , если заданный режим доступа поддерживается, в противном случае false.

Возврат значения false для заданного режима доступа указывает на то, что при вызове соответствующего метода режима доступа будет выброшено UnsupportedOperationException.

Параметры:
accessMode - режим доступа, соответствующий методу с тем же именем, полиморфному по сигнатуре
Возвращает:
true , если заданный режим доступа поддерживается, в противном случае false.

toMethodHandle

public MethodHandle toMethodHandle(VarHandle.AccessMode accessMode)
Получает метод-обработчик, связанный с этим VarHandle и заданным режимом доступа.
API Note:
Этот метод для VarHandle vh и режима доступа {access-mode}, возвращает метод-обработчик, эквивалентный методу-обработчику bmh в следующем коде (хотя он может быть более эффективным):

 MethodHandle mh = MethodHandles.varHandleExactInvoker(
                       vh.accessModeType(VarHandle.AccessMode.{access-mode}));

 MethodHandle bmh = mh.bindTo(vh);
 
Параметры:
accessMode - режим доступа, соответствующий методу с тем же именем, полиморфному по сигнатуре
Возвращает:
метод-обработчик, связанный с этим VarHandle и заданным режимом доступа

describeConstable

public Optional<VarHandle.VarHandleDesc> describeConstable()
Возвращает номинализированное описание для этого экземпляра, если оно может быть построено, или пустой Optional, если оно не может быть построено.
Specified by:
describeConstable в интерфейсе Constable
Возвращает:
Optional содержащий результирующее номинализированное описание, или пустой Optional, если оно не может быть построено.
Since:
12

fullFence

public static void fullFence()
Обеспечивает, что загрузки и сохранения перед барьером не будут переупорядочены с загрузками и сохранениями после барьера.
API Note:
Игнорируя многие семантические различия с C и C++, этот метод имеет эффекты упорядочения памяти, совместимые с atomic_thread_fence(memory_order_seq_cst)

acquireFence

public static void acquireFence()
Обеспечивает, что загрузки перед барьером не будут переупорядочены с загрузками и сохранениями после барьера.
API Note:
Игнорируя многие семантические различия с C и C++, этот метод имеет эффекты упорядочения памяти, совместимые с atomic_thread_fence(memory_order_acquire)

releaseFence

public static void releaseFence()
Обеспечивает, что загрузки и сохранения перед барьером не будут переупорядочены с сохранениями после барьера.
API Note:
Игнорируя многие семантические различия с C и C++, этот метод имеет эффекты упорядочения памяти, совместимые с atomic_thread_fence(memory_order_release)

loadLoadFence

public static void loadLoadFence()
Обеспечивает, что загрузки перед барьером не будут переупорядочены с загрузками после барьера.

storeStoreFence

public static void storeStoreFence()
Обеспечивает, что сохранения перед барьером не будут переупорядочены с сохранениями после барьера.

© 1993, 2021, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/invoke/VarHandle.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API