Spec-Zone.ru › OpenJDK 21

Класс VarHandle

java.lang.Object
java.lang.invoke.VarHandle
Все реализованные интерфейсы:
Constable
public abstract sealed 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.

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

Вызов метода Java, именующий метод режима доступа, может вызывать VarHandle из исходного кода Java. С точки зрения исходного кода, эти методы могут принимать любые аргументы, и их полиморфный результат (если он выражен) может быть преобразован к любому типу возврата. Формально это достигается путем предоставления методам режима доступа переменной арности Object аргументов и Object типов возврата (если тип возврата полиморфен), но у них есть дополнительное свойство, называемое полиморфизмом сигнатуры, которое связывает эту свободу вызова непосредственно со стеком выполнения JVM.

Как обычно для виртуальных методов, вызовы методов режима доступа на уровне исходного кода компилируются в инструкцию invokevirtual. Более необычно, компилятор должен записывать фактические типы аргументов и не может выполнять преобразования вызова метода для аргументов. Вместо этого он должен сгенерировать инструкции для их помещения на стек в соответствии с их собственными не преобразованными типами. Объект VarHandle сам будет помещен на стек перед аргументами. Затем компилятор генерирует инструкцию invokevirtual, которая вызывает метод режима доступа со символическим описателем типа, описывающим типы аргументов и возврата.

Для выдачи полного символического описателя типа компилятор также должен определить тип возврата (если он полиморфен). Это основано на приведении типа в выражении вызова метода, если оно есть, или же Object, если вызов является выражением, или же void, если вызов является оператором. Приведение может быть к примитивному типу (но не void).

В качестве граничного случая, неприведённому null аргументу присваивается символическое описание типа java.lang.Void. Неопределённость с типом Void не вредна, так как нет ссылок типа Void за исключением ссылки null.

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

В первый раз, когда выполняется инструкция invokevirtual, она связывается путём символического разрешения имён в инструкции и проверки того, что вызов метода статически допустим. Это также относится к вызовам методов режима доступа. В этом случае символический описатель типа, выпущенный компилятором, проверяется на правильность синтаксиса, и имена, содержащиеся в нём, разрешаются. Таким образом, инструкция invokevirtual, которая вызывает метод режима доступа, всегда будет связана, если символический описатель типа имеет правильный синтаксис и типы существуют.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Создание VarHandle

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

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

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

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

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

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

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

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

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

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

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

Модификатор и тип Класс Описание
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 есть поведение invoke-exact.
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, но поведение вызова методов режима доступа изменено на поведение invoke.
abstract VarHandle withInvokeExactBehavior()
Возвращает VarHandle, с доступом к тем же переменным, что и у этого VarHandle, но поведение вызова методов режима доступа изменено на поведение invoke-exact.

Методы, объявленные в классе 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, но поведение вызова методов режима доступа скорректировано на поведение invoke-exact.

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

Вызов hasInvokeExactBehavior() на возвращаемом обработчике переменных гарантированно вернет true.

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

withInvokeBehavior

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

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

Вызов hasInvokeExactBehavior() на возвращаемом обработчике переменных гарантированно вернет false.

Returns:
VarHandle с поведением invoke
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 boolean isAccessModeSupported(VarHandle.AccessMode accessMode)
Возвращает true если заданный режим доступа поддерживается, в противном случае false.

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

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

toMethodHandle

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

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

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

describeConstable

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

fullFence

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

acquireFence

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

releaseFence

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

loadLoadFence

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

storeStoreFence

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

© 1993, 2023, 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/21/docs/api/java.base/java/lang/invoke/VarHandle.html

Spec-Zone.ru

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