Класс VarHandle
- java.lang.Object
-
- java.lang.invoke.VarHandle
public abstract class VarHandle extends Object
Обработчик переменных (VarHandle) — это динамически сильно типизированная ссылка на переменную или параметрически определённую группу переменных, включая статические поля, нестатические поля, элементы массива или компоненты внекучной структуры данных. Доступ к таким переменным поддерживается в различных режимах доступа, включая прямой доступ для чтения/записи, доступ для чтения/записи с применением ключевого слова volatile и сравнение-с-заменой.
Обработчики переменных (VarHandle) являются неизменяемыми и не имеют видимого состояния. Пользователь не может создавать подклассы для обработчиков переменных (VarHandle).
Обработчик переменных (VarHandle) имеет:
- тип
variable typeT, который соответствует типу каждой переменной, к которой ссылается этот обработчик переменных; и - список типов
coordinate typesCT1, CT2, ..., CTn, соответствующих типам координатных выражений, которые совместно определяют переменную, к которой ссылается этот обработчик переменных.
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, - битовые атомарные режимы доступа к обновлению, которые, например, атомарно получают и побитово OR значение переменной с заданными эффектами упорядочивания памяти. Множество соответствующих методов режима доступа из этой группы состоит из методов
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 (если тип возврата полиморфный), но у них есть дополнительное свойство, называемое полиморфизмом по сигнатуре Как обычно для виртуальных методов, вызовы методов доступа на уровне исходного кода компилируются в инструкцию invokevirtual. Более необычно, компилятор должен записать фактические типы аргументов и не может выполнять преобразования вызовов методов для аргументов. Вместо этого он должен сгенерировать инструкции для их помещения в стек в соответствии с их собственными не преобразованными типами. Объект VarHandle сам будет помещён в стек перед аргументами. Затем компилятор генерирует инструкцию invokevirtual, которая вызывает метод доступа с символическим описателем типа, описывающим типы аргументов и возвращаемого значения.
Для выдачи полного символического описателя типа компилятор также должен определить тип возвращаемого значения (если полиморфный). Это основано на приведении в выражении вызова метода, если оно есть, или же Object, если вызов является выражением, или же void, если вызов является оператором. Приведение может быть к примитивному типу (но не void).
В качестве крайнего случая, неприведённому null аргументу присваивается символическое описание типа java.lang.Void. Неопределённость с типом Void не причиняет вреда, так как нет ссылок типа Void кроме нулевой ссылки.
Выполнение вызова методов доступа
В первый раз при выполнении инструкцииinvokevirtual она связывается путём символического разрешения имён в инструкции и проверки того, что вызов метода статически допустим. Это также относится к вызовам методов доступа. В этом случае символическое описание типа, выпущенное компилятором, проверяется на корректность синтаксиса, а имена, которые оно содержит, разрешаются. Таким образом, инструкция invokevirtual, которая вызывает метод доступа, всегда будет связана, если символическое описание типа имеет правильный синтаксис и типы существуют. Когда инструкция invokevirtual выполняется после связи, JVM сначала проверяет тип режима доступа получающего VarHandle, чтобы убедиться, что он соответствует символическому описателю типа. Если проверка типа не пройдена, это означает, что метод доступа, который вызывается вызывающим объектом, не присутствует в конкретном VarHandle, к которому он обращается.
Вызов метода доступа ведёт себя так, как если бы вызывался MethodHandle.invoke(java.lang.Object...), где получающий метод принимает экземпляр VarHandle в качестве ведущего аргумента. Более конкретно, следующее, где {access-mode} соответствует имени метода доступа:
VarHandle vh = ..
R r = (R) vh.{access-mode}(p1, p2, ..., pN); ведёт себя так же, как: VarHandle vh = ..
VarHandle.AccessMode am = VarHandle.AccessMode.valueFromMethodName("{access-mode}");
MethodHandle mh = MethodHandles.varHandleExactInvoker(
am,
vh.accessModeType(am));
R r = (R) mh.invoke(vh, p1, p2, ..., pN) (методы доступа по модулю не объявляют о выбросе Throwable). Это эквивалентно: MethodHandle mh = MethodHandles.lookup().findVirtual(
VarHandle.class,
"{access-mode}",
MethodType.methodType(R, p1, p2, ..., pN));
R r = (R) mh.invokeExact(vh, p1, p2, ..., pN), где требуемый тип метода — это символическое описание типа, и выполняется MethodHandle.invokeExact(java.lang.Object...), так как перед вызовом целевого объекта обработчик применит необходимые преобразования ссылок и упакует, распакует или расширит примитивные значения, как будто бы с помощью asType (см. также MethodHandles.varHandleInvoker(java.lang.invoke.VarHandle.AccessMode, java.lang.invoke.MethodType)). Более кратко, такое поведение эквивалентно: VarHandle vh = ..
VarHandle.AccessMode am = VarHandle.AccessMode.valueFromMethodName("{access-mode}");
MethodHandle mh = vh.toMethodHandle(am);
R r = (R) mh.invoke(p1, p2, ..., pN), где в этом случае метод связан с экземпляром VarHandle. Проверка вызова
В типичных программах сопоставление типов режимов доступа VarHandle обычно проходит успешно. Но если сопоставление не пройдёт, JVM выброситWrongMethodTypeException. Таким образом, несовпадение типов режима доступа, которое может проявляться как ошибка связи в статически типизированной программе, может проявляться как динамическая WrongMethodTypeException в программе, использующей VarHandles.
Поскольку типы режимов доступа содержат "живые" Class объекты, сопоставление типов методов учитывает как имена типов, так и загрузчики классов. Таким образом, даже если VarHandle VH создан в одном загрузчике классов L1 и используется в другом L2, вызовы методов доступа VarHandle являются безопасными с точки зрения типов, потому что символическое описание типа вызывающего объекта, как разрешено в L2, сопоставляется со символическим описанием типа исходного метода, как разрешено в L1. Разрешение в L1 происходит при создании VH и присвоении его типов режимов доступа, а разрешение в L2 происходит при связывании инструкции invokevirtual.
Помимо проверок описателей типов, возможности VarHandle обращаться к переменным не ограничены. Если 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
Используя фабричные методы вLookup API, любое поле, представленное объектом 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. - С тех пор:
- 9
- См. также:
-
MethodHandle,MethodHandles,MethodType
Вложенные классы
| Модификатор и тип | Класс | Описание |
|---|---|---|
static class | VarHandle.AccessMode | Набор режимов доступа, которые определяют, как переменная, к которой обращается VarHandle, обращается. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
MethodType | accessModeType(VarHandle.AccessMode accessMode) | Получает тип режима доступа для этого VarHandle и заданного режима доступа. |
static void | acquireFence() | Гарантирует, что загрузки перед ограждением не будут переупорядочиваться с загрузками и сохранениями после ограждения. |
Object | compareAndExchange(Object... args) | Атомарно устанавливает значение переменной в |
Object | compareAndExchangeAcquire(Object... args) | Атомарно устанавливает значение переменной в |
Object | compareAndExchangeRelease(Object... args) | Атомарно устанавливает значение переменной в |
boolean | compareAndSet(Object... args) | Атомарно устанавливает значение переменной в |
List<Class<?>> | coordinateTypes() | Возвращает типы координат для этого VarHandle. |
static void | fullFence() | Гарантирует, что загрузки и сохранения перед ограждением не будут переупорядочиваться с загрузками и сохранениями после ограждения. |
Object | get(Object... args) | Возвращает значение переменной с семантикой памяти чтения, как если бы переменная была объявлена как не- |
Object | getAcquire(Object... args) | Возвращает значение переменной и гарантирует, что последующие загрузки и сохранения не будут переупорядочены перед этим доступом. |
Object | getAndAdd(Object... args) | Атомарно добавляет |
Object | getAndAddAcquire(Object... args) | Атомарно добавляет |
Object | getAndAddRelease(Object... args) | Атомарно добавляет |
Object | getAndBitwiseAnd(Object... args) | Атомарно устанавливает значение переменной в результат побитового И между текущим значением переменной и |
Object | getAndBitwiseAndAcquire(Object... args) | Атомарно устанавливает значение переменной в результат побитового И между текущим значением переменной и |
Object | getAndBitwiseAndRelease(Object... args) | Атомарно устанавливает значение переменной в результат побитового И между текущим значением переменной и |
Object | getAndBitwiseOr(Object... args) | Атомарно устанавливает значение переменной в результат побитового ИЛИ между текущим значением переменной и |
Object | getAndBitwiseOrAcquire(Object... args) | Атомарно устанавливает значение переменной в результат побитового ИЛИ между текущим значением переменной и |
Object | getAndBitwiseOrRelease(Object... args) | Атомарно устанавливает значение переменной в результат побитового ИЛИ между текущим значением переменной и |
Object | getAndBitwiseXor(Object... args) | Атомарно устанавливает значение переменной в результат побитового XOR между текущим значением переменной и |
Object | getAndBitwiseXorAcquire(Object... args) | Атомарно устанавливает значение переменной в результат побитового XOR между текущим значением переменной и |
Object | getAndBitwiseXorRelease(Object... args) | Атомарно устанавливает значение переменной в результат побитового XOR между текущим значением переменной и |
Object | getAndSet(Object... args) | Атомарно устанавливает значение переменной в |
Object | getAndSetAcquire(Object... args) | Атомарно устанавливает значение переменной в |
Object | getAndSetRelease(Object... args) | Атомарно устанавливает значение переменной в |
Object | getOpaque(Object... args) | Возвращает значение переменной, доступное в порядке программы, но без гарантии эффектов упорядочения памяти по отношению к другим потокам. |
Object | getVolatile(Object... args) | Возвращает значение переменной с семантикой памяти чтения, как если бы переменная была объявлена |
boolean | isAccessModeSupported(VarHandle.AccessMode accessMode) | Возвращает |
static void | loadLoadFence() | Обеспечивает, что загрузки перед барьером не будут переупорядочены с загрузками после барьера. |
|---|---|---|
static void | releaseFence() | Обеспечивает, что загрузки и сохранения перед барьером не будут переупорядочены с сохранениями после барьера. |
void | set(Object... args) | Устанавливает значение переменной в |
void | setOpaque(Object... args) | Устанавливает значение переменной в |
void | setRelease(Object... args) | Устанавливает значение переменной в |
void | setVolatile(Object... args) | Устанавливает значение переменной в |
static void | storeStoreFence() | Обеспечивает, что сохранения перед барьером не будут переупорядочены с сохранениями после барьера. |
MethodHandle | toMethodHandle(VarHandle.AccessMode accessMode) | Получает обработчик метода, связанный с этим VarHandle и заданным режимом доступа. |
Class<?> | varType() | Возвращает тип переменной, к которой ссылается этот VarHandle. |
boolean | weakCompareAndSet(Object... args) | Возможно атомарно устанавливает значение переменной в |
boolean | weakCompareAndSetAcquire(Object... args) | Возможно атомарно устанавливает значение переменной в |
boolean | weakCompareAndSetPlain(Object... args) | Возможно атомарно устанавливает значение переменной в |
boolean | weakCompareAndSetRelease(Object... args) | Возможно атомарно устанавливает значение переменной в |
Методы, объявленные в классе java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait Методы
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.
- Параметры:
-
args- список параметров подписи-полиморфизма вида(CT1 ct1, ..., CTn ctn, T mask), статически представленный с помощью varargs. - Возвращает:
- результат подписи-полиморфизма, который является предыдущим значением переменной, статически представленный с помощью
Object. - Исключение:
-
UnsupportedOperationException- если режим доступа не поддерживается для этого VarHandle. -
WrongMethodTypeException- если тип режима доступа не соответствует символьному описателю типа вызывающего объекта. -
ClassCastException- если тип режима доступа соответствует символьному описателю типа вызывающего объекта, но преобразование ссылки не удалось. - См. также:
-
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.
- Параметры:
-
args- список параметров подписи-полиморфизма вида(CT1 ct1, ..., CTn ctn, T mask), статически представленный с помощью varargs. - Возвращает:
- результат подписи-полиморфизма, который является предыдущим значением переменной, статически представленный с помощью
Object. - Исключение:
-
UnsupportedOperationException- если режим доступа не поддерживается для этого VarHandle. -
WrongMethodTypeException- если тип режима доступа не соответствует символьному описателю типа вызывающего объекта. -
ClassCastException- если тип режима доступа соответствует символьному описателю типа вызывающего объекта, но преобразование ссылки не удалось. - См. также:
-
setRelease(Object...),get(Object...)
getAndBitwiseXor
public final Object getAndBitwiseXor(Object... args)
Атомарно устанавливает значение переменной в результат побитового ИСКЛЮЧАЮЩЕГО ИЛИ между текущим значением переменной и mask с семантикой памяти setVolatile(java.lang.Object...) и возвращает предыдущее значение переменной, как оно доступно с семантикой памяти getVolatile(java.lang.Object...).
Если тип переменной является нецелочисленным типом boolean, то выполняется логическое ИСКЛЮЧАЮЩЕЕ ИЛИ вместо побитового ИСКЛЮЧАЮЩЕГО ИЛИ.
Подпись метода имеет вид (CT1 ct1, ..., CTn ctn, T mask)T.
Символьный описатель типа в месте вызова getAndBitwiseXor должен соответствовать типу режима доступа, являющемуся результатом вызова accessModeType(VarHandle.AccessMode.GET_AND_BITWISE_XOR) для этого VarHandle.
- Параметры:
-
args- список параметров подписи-полиморфизма вида(CT1 ct1, ..., CTn ctn, T mask), статически представленный с помощью varargs. - Возвращает:
- результат подписи-полиморфизма, который является предыдущим значением переменной, статически представленный с помощью
Object. - Исключение:
-
UnsupportedOperationException- если режим доступа не поддерживается для этого VarHandle. -
WrongMethodTypeException- если тип режима доступа не соответствует символьному описателю типа вызывающего объекта. -
ClassCastException- если тип режима доступа соответствует символьному описателю типа вызывающего объекта, но преобразование ссылки не удалось. - См. также:
-
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.
- Параметры:
-
args- полиморфный по подписи список параметров вида(CT1 ct1, ..., CTn ctn, T mask), статически представленный с помощью varargs. - Возвращает:
- результат полиморфной по подписи, который представляет собой предыдущее значение переменной, статически представленный с помощью
Object. - Исключения:
-
UnsupportedOperationException- если режим доступа не поддерживается для этого VarHandle. -
WrongMethodTypeException- если тип режима доступа не соответствует символьному типу описания вызывающего. -
ClassCastException- если тип режима доступа соответствует символьному типу описания вызывающего, но неудалось выполнить приведение ссылки. - См. также:
-
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.
- Параметры:
-
args- полиморфный по подписи список параметров вида(CT1 ct1, ..., CTn ctn, T mask), статически представленный с помощью varargs. - Возвращает:
- результат полиморфной по подписи, который представляет собой предыдущее значение переменной, статически представленный с помощью
Object. - Исключения:
-
UnsupportedOperationException- если режим доступа не поддерживается для этого VarHandle. -
WrongMethodTypeException- если тип режима доступа не соответствует символьному типу описания вызывающего. -
ClassCastException- если тип режима доступа соответствует символьному типу описания вызывающего, но неудалось выполнить приведение ссылки. - См. также:
-
setRelease(Object...),get(Object...)
varType
public final Class<?> varType()
Возвращает тип переменной, к которой ссылается этот VarHandle.
- Возвращает:
- тип переменной, к которой ссылается этот VarHandle
coordinateTypes
public final 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 final 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 и заданным режимом доступа
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, 2020, 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/11/docs/api/java.base/java/lang/invoke/VarHandle.html