Spec-Zone.ru › OpenJDK 25

Класс StampedLock

java.lang.Object
java.util.concurrent.locks.StampedLock
Все реализуемые интерфейсы:
Serializable
public class StampedLock extends Object implements Serializable
Блокировка на основе возможностей с тремя режимами управления доступом для чтения и записи. Состояние StampedLock состоит из версии и режима. Методы получения блокировки возвращают штамп, который представляет доступ к состоянию блокировки и управляет им; версии этих методов с префиксом «try» вместо этого могут возвращать специальное значение ноль, означающее, что получить доступ не удалось. Методы освобождения блокировки и преобразования требуют штампы в качестве аргументов и завершаются неудачей, если штампы не соответствуют состоянию блокировки. Доступны три режима:
  • Запись. Метод writeLock() может блокировать поток в ожидании эксклюзивного доступа и возвращает штамп, который можно использовать в методе unlockWrite(long) для снятия блокировки. Также доступны версии tryWriteLock без ограничения времени ожидания и с ограничением времени ожидания. Когда блокировка удерживается в режиме записи, получить блокировки чтения нельзя, а все проверки оптимистичного чтения завершаются неудачей.
  • Чтение. Метод readLock() может блокировать поток в ожидании неэксклюзивного доступа и возвращает штамп, который можно использовать в методе unlockRead(long) для снятия блокировки. Также доступны версии tryReadLock без ограничения времени ожидания и с ограничением времени ожидания.
  • Оптимистичное чтение. Метод tryOptimisticRead() возвращает ненулевой штамп, только если блокировка в данный момент не удерживается в режиме записи. Метод validate(long) возвращает true, если после получения заданного штампа блокировка не захватывалась в режиме записи; в этом случае все действия, предшествующие последнему освобождению блокировки записи, происходят-before действий, следующих за вызовом tryOptimisticRead. Этот режим можно считать крайне ослабленной версией блокировки чтения, которую записывающий поток может прервать в любой момент. Использование режима оптимистичного чтения для коротких сегментов кода, выполняющих только чтение, часто снижает конкуренцию и повышает пропускную способность. Однако его использование по своей природе ненадёжно. В секциях оптимистичного чтения следует только считывать поля и сохранять их в локальных переменных для последующего использования после проверки. Значения полей, прочитанные в режиме оптимистичного чтения, могут быть крайне несогласованными, поэтому этот режим следует использовать только в том случае, если вы достаточно хорошо знакомы с представлением данных, чтобы проверять согласованность и/или многократно вызывать метод validate(). Например, такие шаги обычно необходимы, когда сначала считывается ссылка на объект или массив, а затем выполняется обращение к одному из его полей, элементов или методов.

Этот класс также поддерживает методы, условно преобразующие блокировку между тремя режимами. Например, метод tryConvertToWriteLock(long) пытается «повысить» режим, возвращая действительный штамп записи, если выполняется одно из условий: (1) блокировка уже находится в режиме записи; (2) блокировка находится в режиме чтения и других читателей нет; или (3) блокировка находится в режиме оптимистичного чтения и доступна. Формы этих методов разработаны, чтобы сократить разрастание кода, которое иначе возникает при использовании схем на основе повторных попыток.

StampedLock предназначены для использования в качестве внутренних вспомогательных средств при разработке потокобезопасных компонентов. Их применение основано на знании внутренних свойств защищаемых данных, объектов и методов. Они не являются реентерабельными, поэтому код внутри блокировки не должен вызывать другие неизвестные методы, которые могут попытаться повторно захватить блокировки (хотя штамп можно передать другим методам, которые могут использовать его или преобразовать). Использование режимов блокировки чтения предполагает, что соответствующие секции кода не имеют побочных эффектов. В секциях оптимистичного чтения без проверки нельзя вызывать методы, которые не гарантируют корректную работу при возможной несогласованности данных. Штампы имеют конечное представление и не являются криптографически защищёнными (то есть действительный штамп можно угадать). Значения штампов могут повторно использоваться после (но не ранее чем через) одного года непрерывной работы. Штамп, хранящийся без использования или проверки дольше этого периода, может не пройти проверку корректно. StampedLock сериализуемы, но всегда десериализуются в исходное незаблокированное состояние, поэтому не подходят для удалённой блокировки.

Подобно Semaphore, но в отличие от большинства реализаций Lock, StampedLock не имеют понятия владения. Блокировки, захваченные в одном потоке, можно освободить или преобразовать в другом.

Политика планирования StampedLock не отдаёт постоянного предпочтения ни читателям, ни записывающим потокам. Все методы с префиксом «try» работают по возможности и не обязательно соответствуют какой-либо политике планирования или справедливости. Возвращаемый любым методом «try» для захвата или преобразования блокировки ноль не содержит информации о состоянии блокировки; следующий вызов может завершиться успешно.

Поскольку этот класс поддерживает согласованное использование нескольких режимов блокировки, он напрямую не реализует интерфейсы Lock или ReadWriteLock. Однако в приложениях, которым нужен только соответствующий набор функций, StampedLock можно представить как asReadLock(), asWriteLock() или asReadWriteLock().

Синхронизация памяти. Методы, успешно захватывающие блокировку в любом режиме, имеют те же эффекты синхронизации памяти, что и действие Lock, описанное в главе 17 Спецификации языка Java. Методы, успешно освобождающие блокировку в режиме записи, имеют те же эффекты синхронизации памяти, что и действие Unlock. При использовании оптимистичного чтения действия, предшествующие последнему действию освобождения блокировки в режиме записи, гарантированно происходят-before действий, следующих за tryOptimisticRead, только если последующий вызов validate возвращает true; в противном случае нет гарантии, что чтения между tryOptimisticRead и validate дают согласованный снимок.

Пример использования. Ниже показаны некоторые идиомы использования в классе, который хранит простые двумерные точки. В примере кода показаны некоторые соглашения по использованию try/catch, хотя здесь они не строго необходимы, поскольку в теле блоков не может возникнуть исключений.

class Point {
  private double x, y;
  private final StampedLock sl = new StampedLock();

  // an exclusively locked method
  void move(double deltaX, double deltaY) {
    long stamp = sl.writeLock();
    try {
      x += deltaX;
      y += deltaY;
    } finally {
      sl.unlockWrite(stamp);
    }
  }

  // a read-only method
  // upgrade from optimistic read to read lock
  double distanceFromOrigin() {
    long stamp = sl.tryOptimisticRead();
    try {
      retryHoldingLock: for (;; stamp = sl.readLock()) {
        if (stamp == 0L)
          continue retryHoldingLock;
        // possibly racy reads
        double currentX = x;
        double currentY = y;
        if (!sl.validate(stamp))
          continue retryHoldingLock;
        return Math.hypot(currentX, currentY);
      }
    } finally {
      if (StampedLock.isReadLockStamp(stamp))
        sl.unlockRead(stamp);
    }
  }

  // upgrade from optimistic read to write lock
  void moveIfAtOrigin(double newX, double newY) {
    long stamp = sl.tryOptimisticRead();
    try {
      retryHoldingLock: for (;; stamp = sl.writeLock()) {
        if (stamp == 0L)
          continue retryHoldingLock;
        // possibly racy reads
        double currentX = x;
        double currentY = y;
        if (!sl.validate(stamp))
          continue retryHoldingLock;
        if (currentX != 0.0 || currentY != 0.0)
          break;
        stamp = sl.tryConvertToWriteLock(stamp);
        if (stamp == 0L)
          continue retryHoldingLock;
        // exclusive access
        x = newX;
        y = newY;
        return;
      }
    } finally {
      if (StampedLock.isWriteLockStamp(stamp))
        sl.unlockWrite(stamp);
    }
  }

  // upgrade read lock to write lock
  void moveIfAtOrigin2(double newX, double newY) {
    long stamp = sl.readLock();
    try {
      while (x == 0.0 && y == 0.0) {
        long ws = sl.tryConvertToWriteLock(stamp);
        if (ws != 0L) {
          stamp = ws;
          x = newX;
          y = newY;
          break;
        }
        else {
          sl.unlockRead(stamp);
          stamp = sl.writeLock();
        }
      }
    } finally {
      sl.unlock(stamp);
    }
  }
}
См. Спецификацию языка Java:
17.4 Модель памяти
Начиная с версии:
1.8
См. также:
  • Сериализованная форма

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

Конструктор Описание
StampedLock()
Создаёт новую блокировку, изначально находящуюся в незаблокированном состоянии.

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

Модификатор и тип Метод Описание
Lock asReadLock()
Возвращает обычное представление этого StampedLock в виде Lock, в котором метод Lock.lock() сопоставлен с readLock(), и аналогично для других методов.
ReadWriteLock asReadWriteLock()
Возвращает представление этого StampedLock в виде ReadWriteLock, в котором метод ReadWriteLock.readLock() сопоставлен с asReadLock(), а метод ReadWriteLock.writeLock() — с asWriteLock().
Lock asWriteLock()
Возвращает обычное представление этого StampedLock в виде Lock, в котором метод Lock.lock() сопоставлен с writeLock(), и аналогично для других методов.
int getReadLockCount()
Возвращает количество удерживаемых блокировок чтения для этой блокировки.
static boolean isLockStamp(long stamp)
Определяет, означает ли штамп, что блокировка удерживается.
static boolean isOptimisticReadStamp(long stamp)
Определяет, означает ли штамп успешное оптимистичное чтение.
boolean isReadLocked()
Возвращает true, если в данный момент блокировка удерживается неэксклюзивно.
static boolean isReadLockStamp(long stamp)
Определяет, означает ли штамп, что блокировка удерживается неэксклюзивно.
boolean isWriteLocked()
Возвращает true, если в данный момент блокировка удерживается эксклюзивно.
static boolean isWriteLockStamp(long stamp)
Определяет, означает ли штамп, что блокировка удерживается эксклюзивно.
long readLock()
Захватывает блокировку неэксклюзивно, при необходимости блокируя поток до её освобождения.
long readLockInterruptibly()
Захватывает блокировку неэксклюзивно, при необходимости блокируя поток до её освобождения или прерывания текущего потока.
String toString()
Возвращает строку, идентифицирующую эту блокировку и её состояние.
long tryConvertToOptimisticRead(long stamp)
Если состояние блокировки соответствует заданному штампу, атомарно освобождает блокировку, если штамп означает, что она удерживается, и возвращает штамп наблюдения.
long tryConvertToReadLock(long stamp)
Если состояние блокировки соответствует заданному штампу, атомарно выполняет одно из следующих действий.
long tryConvertToWriteLock(long stamp)
Если состояние блокировки соответствует заданному штампу, атомарно выполняет одно из следующих действий.
long tryOptimisticRead()
Возвращает штамп, который впоследствии можно проверить, или ноль, если блокировка захвачена эксклюзивно.
long tryReadLock()
Захватывает блокировку неэксклюзивно, если она доступна немедленно.
long tryReadLock(long time, TimeUnit unit)
Захватывает блокировку неэксклюзивно, если она становится доступна в течение заданного времени и текущий поток не был прерван.
boolean tryUnlockRead()
Освобождает одно удержание блокировки чтения, если она захвачена, без необходимости указывать значение штампа.
boolean tryUnlockWrite()
Освобождает блокировку записи, если она захвачена, без необходимости указывать значение штампа.
long tryWriteLock()
Захватывает блокировку эксклюзивно, если она доступна немедленно.
long tryWriteLock(long time, TimeUnit unit)
Захватывает блокировку эксклюзивно, если она становится доступна в течение заданного времени и текущий поток не был прерван.
void unlock(long stamp)
Если состояние блокировки соответствует заданному штампу, освобождает блокировку в соответствующем режиме.
void unlockRead(long stamp)
Если состояние блокировки соответствует заданному штампу, освобождает неэксклюзивную блокировку.
void unlockWrite(long stamp)
Если состояние блокировки соответствует заданному штампу, освобождает эксклюзивную блокировку.
boolean validate(long stamp)
Возвращает true, если после выдачи заданного штампа блокировка не захватывалась эксклюзивно.
long writeLock()
Захватывает блокировку эксклюзивно, при необходимости блокируя поток до её освобождения.
long writeLockInterruptibly()
Захватывает блокировку эксклюзивно, при необходимости блокируя поток до её освобождения или прерывания текущего потока.

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

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

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

StampedLock

public StampedLock()
Создает новую блокировку, изначально находящуюся в разблокированном состоянии.

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

writeLock

public long writeLock()
Захватывает блокировку эксклюзивно, при необходимости ожидая ее освобождения.
Возвращает:
штамп записи, который можно использовать для снятия блокировки или преобразования режима

tryWriteLock

public long tryWriteLock()
Захватывает блокировку эксклюзивно, если она доступна немедленно.
Возвращает:
штамп записи, который можно использовать для снятия блокировки или преобразования режима, либо ноль, если блокировка недоступна

tryWriteLock

public long tryWriteLock(long time, TimeUnit unit) throws InterruptedException
Захватывает блокировку эксклюзивно, если она станет доступна в течение указанного времени и текущий поток не был прерван. Поведение при истечении времени ожидания и прерывании соответствует описанному для метода Lock.tryLock(long,TimeUnit).
Параметры:
time — максимальное время ожидания блокировки
unit — единица измерения аргумента time
Возвращает:
штамп записи, который можно использовать для снятия блокировки или преобразования режима, либо ноль, если блокировка недоступна
Выбрасывает:
InterruptedException — если текущий поток прерван до захвата блокировки

writeLockInterruptibly

public long writeLockInterruptibly() throws InterruptedException
Захватывает блокировку эксклюзивно, при необходимости ожидая ее освобождения или прерывания текущего потока. Поведение при прерывании соответствует описанному для метода Lock.lockInterruptibly().
Возвращает:
штамп записи, который можно использовать для снятия блокировки или преобразования режима
Выбрасывает:
InterruptedException — если текущий поток прерван до захвата блокировки

readLock

public long readLock()
Захватывает блокировку неэксклюзивно, при необходимости ожидая ее освобождения.
Возвращает:
штамп чтения, который можно использовать для снятия блокировки или преобразования режима

tryReadLock

public long tryReadLock()
Захватывает блокировку неэксклюзивно, если она доступна немедленно.
Возвращает:
штамп чтения, который можно использовать для снятия блокировки или преобразования режима, либо ноль, если блокировка недоступна

tryReadLock

public long tryReadLock(long time, TimeUnit unit) throws InterruptedException
Захватывает блокировку неэксклюзивно, если она станет доступна в течение указанного времени и текущий поток не был прерван. Поведение при истечении времени ожидания и прерывании соответствует описанному для метода Lock.tryLock(long,TimeUnit).
Параметры:
time — максимальное время ожидания блокировки
unit — единица измерения аргумента time
Возвращает:
штамп чтения, который можно использовать для снятия блокировки или преобразования режима, либо ноль, если блокировка недоступна
Выбрасывает:
InterruptedException — если текущий поток прерван до захвата блокировки

readLockInterruptibly

public long readLockInterruptibly() throws InterruptedException
Захватывает блокировку неэксклюзивно, при необходимости ожидая ее освобождения или прерывания текущего потока. Поведение при прерывании соответствует описанному для метода Lock.lockInterruptibly().
Возвращает:
штамп чтения, который можно использовать для снятия блокировки или преобразования режима
Выбрасывает:
InterruptedException — если текущий поток прерван до захвата блокировки

tryOptimisticRead

public long tryOptimisticRead()
Возвращает штамп, который впоследствии можно проверить, или ноль, если блокировка захвачена эксклюзивно.
Возвращает:
действительный штамп оптимистического чтения или ноль, если блокировка захвачена эксклюзивно

validate

public boolean validate(long stamp)
Возвращает true, если после выдачи указанного штампа блокировка не захватывалась эксклюзивно. Всегда возвращает false, если штамп равен нулю. Всегда возвращает true, если штамп соответствует удерживаемой в данный момент блокировке. Вызов этого метода со значением, полученным не из tryOptimisticRead() или метода захвата блокировки для этой блокировки, не имеет определенного эффекта или результата.
Параметры:
stamp — штамп
Возвращает:
true, если после выдачи указанного штампа блокировка не захватывалась эксклюзивно; в противном случае false

unlockWrite

public void unlockWrite(long stamp)
Если состояние блокировки соответствует указанному штампу, освобождает эксклюзивную блокировку.
Параметры:
stamp — штамп, возвращенный операцией захвата блокировки на запись
Выбрасывает:
IllegalMonitorStateException — если штамп не соответствует текущему состоянию этой блокировки

unlockRead

public void unlockRead(long stamp)
Если состояние блокировки соответствует указанному штампу, освобождает неэксклюзивную блокировку.
Параметры:
stamp — штамп, возвращенный операцией захвата блокировки на чтение
Выбрасывает:
IllegalMonitorStateException — если штамп не соответствует текущему состоянию этой блокировки

unlock

public void unlock(long stamp)
Если состояние блокировки соответствует указанному штампу, освобождает соответствующий режим блокировки.
Параметры:
stamp — штамп, возвращенный операцией захвата блокировки
Выбрасывает:
IllegalMonitorStateException — если штамп не соответствует текущему состоянию этой блокировки

tryConvertToWriteLock

public long tryConvertToWriteLock(long stamp)
Если состояние блокировки соответствует указанному штампу, атомарно выполняет одно из следующих действий. Если штамп соответствует удерживаемой блокировке на запись, возвращает его. Если штамп соответствует блокировке на чтение и блокировка на запись доступна, освобождает блокировку на чтение и возвращает штамп записи. Если штамп соответствует оптимистическому чтению, возвращает штамп записи только в том случае, если блокировка доступна немедленно. Во всех остальных случаях этот метод возвращает ноль.
Параметры:
stamp — штамп
Возвращает:
действительный штамп записи или ноль в случае неудачи

tryConvertToReadLock

public long tryConvertToReadLock(long stamp)
Если состояние блокировки соответствует указанному штампу, атомарно выполняет одно из следующих действий. Если штамп соответствует удерживаемой блокировке на запись, освобождает ее и получает блокировку на чтение. Если штамп соответствует блокировке на чтение, возвращает его. Если штамп соответствует оптимистическому чтению, захватывает блокировку на чтение и возвращает штамп чтения только в том случае, если блокировка доступна немедленно. Во всех остальных случаях этот метод возвращает ноль.
Параметры:
stamp — штамп
Возвращает:
действительный штамп чтения или ноль в случае неудачи

tryConvertToOptimisticRead

public long tryConvertToOptimisticRead(long stamp)
Если состояние блокировки соответствует указанному штампу, то атомарно, если штамп соответствует удерживаемой блокировке, освобождает ее и возвращает штамп наблюдения. Если штамп соответствует оптимистическому чтению, возвращает его, если он прошел проверку. Во всех остальных случаях этот метод возвращает ноль, поэтому может быть полезен как форма «tryUnlock».
Параметры:
stamp — штамп
Возвращает:
действительный штамп оптимистического чтения или ноль в случае неудачи

tryUnlockWrite

public boolean tryUnlockWrite()
Освобождает блокировку на запись, если она захвачена, без необходимости указывать значение штампа. Этот метод может быть полезен для восстановления после ошибок.
Возвращает:
true, если блокировка была захвачена; в противном случае false

tryUnlockRead

public boolean tryUnlockRead()
Освобождает одно удержание блокировки на чтение, если она захвачена, без необходимости указывать значение штампа. Этот метод может быть полезен для восстановления после ошибок.
Возвращает:
true, если блокировка на чтение была захвачена; в противном случае false

isWriteLocked

public boolean isWriteLocked()
Возвращает true, если в данный момент блокировка удерживается эксклюзивно.
Возвращает:
true, если в данный момент блокировка удерживается эксклюзивно

isReadLocked

public boolean isReadLocked()
Возвращает true, если в данный момент блокировка удерживается неэксклюзивно.
Возвращает:
true, если в данный момент блокировка удерживается неэксклюзивно

isWriteLockStamp

public static boolean isWriteLockStamp(long stamp)
Показывает, соответствует ли штамп эксклюзивно удерживаемой блокировке. Этот метод может быть полезен в сочетании с tryConvertToWriteLock(long), например:
long stamp = sl.tryOptimisticRead();
try {
  ...
  stamp = sl.tryConvertToWriteLock(stamp);
  ...
} finally {
  if (StampedLock.isWriteLockStamp(stamp))
    sl.unlockWrite(stamp);
}
Параметры:
stamp — штамп, возвращенный предыдущей операцией StampedLock
Возвращает:
true, если штамп был возвращен успешной операцией захвата блокировки на запись
Начиная с версии:
10

isReadLockStamp

public static boolean isReadLockStamp(long stamp)
Показывает, соответствует ли штамп неэксклюзивно удерживаемой блокировке. Этот метод может быть полезен в сочетании с tryConvertToReadLock(long), например:
long stamp = sl.tryOptimisticRead();
try {
  ...
  stamp = sl.tryConvertToReadLock(stamp);
  ...
} finally {
  if (StampedLock.isReadLockStamp(stamp))
    sl.unlockRead(stamp);
}
Параметры:
stamp — штамп, возвращенный предыдущей операцией StampedLock
Возвращает:
true, если штамп был возвращен успешной операцией захвата блокировки на чтение
Начиная с версии:
10

isLockStamp

public static boolean isLockStamp(long stamp)
Показывает, соответствует ли штамп удерживаемой блокировке. Этот метод может быть полезен в сочетании с tryConvertToReadLock(long) и tryConvertToWriteLock(long), например:
long stamp = sl.tryOptimisticRead();
try {
  ...
  stamp = sl.tryConvertToReadLock(stamp);
  ...
  stamp = sl.tryConvertToWriteLock(stamp);
  ...
} finally {
  if (StampedLock.isLockStamp(stamp))
    sl.unlock(stamp);
}
Параметры:
stamp — штамп, возвращенный предыдущей операцией StampedLock
Возвращает:
true, если штамп был возвращен успешной операцией захвата блокировки на чтение или запись
Начиная с версии:
10

isOptimisticReadStamp

public static boolean isOptimisticReadStamp(long stamp)
Показывает, соответствует ли штамп успешному оптимистическому чтению.
Параметры:
stamp — штамп, возвращенный предыдущей операцией StampedLock
Возвращает:
true, если штамп был возвращен успешной операцией оптимистического чтения, то есть ненулевым результатом вызова tryOptimisticRead() или tryConvertToOptimisticRead(long)
Начиная с версии:
10

getReadLockCount

public int getReadLockCount()
Возвращает количество удерживаемых блокировок на чтение для этой блокировки. Этот метод предназначен для мониторинга состояния системы, а не для управления синхронизацией.
Возвращает:
количество удерживаемых блокировок на чтение

toString

public String toString()
Возвращает строку, идентифицирующую эту блокировку и ее состояние. Состояние в квадратных скобках включает строку "Unlocked", строку "Write-locked" или строку "Read-locks:", за которой следует текущее количество удерживаемых блокировок на чтение.
Переопределяет:
toString в классе Object
Возвращает:
строку, идентифицирующую эту блокировку и ее состояние

asReadLock

public Lock asReadLock()
Возвращает представление этого StampedLock в виде обычного Lock, в котором метод Lock.lock() сопоставлен с readLock(), как и другие методы. Возвращенный Lock не поддерживает Condition; метод Lock.newCondition() выбрасывает UnsupportedOperationException.
Возвращает:
блокировку

asWriteLock

public Lock asWriteLock()
Возвращает представление этого StampedLock в виде обычного Lock, в котором метод Lock.lock() сопоставлен с writeLock(), как и другие методы. Возвращенный Lock не поддерживает Condition; метод Lock.newCondition() выбрасывает UnsupportedOperationException.
Возвращает:
блокировку

asReadWriteLock

public ReadWriteLock asReadWriteLock()
Возвращает представление этого StampedLock в виде ReadWriteLock, в котором метод ReadWriteLock.readLock() сопоставлен с asReadLock(), а метод ReadWriteLock.writeLock() — с asWriteLock().
Возвращает:
блокировку

Сообщить об ошибке или предложить улучшение
Дополнительную справочную информацию по API и документацию для разработчиков см. в документации Java SE, содержащей более подробные описания для разработчиков, включая концептуальные обзоры, определения терминов, обходные решения и работающие примеры кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или ее аффилированных лиц в США и других странах.
Авторские права © 1993, 2025, Oracle и/или ее аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 1993, 2025, 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/25/docs/api/java.base/java/util/concurrent/locks/StampedLock.html

Spec-Zone.ru

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