Класс ReentrantReadWriteLock.WriteLock
- Все реализуемые интерфейсы:
Serializable, Lock
- Внешний класс:
ReentrantReadWriteLock
public static class ReentrantReadWriteLock.WriteLock extends Object implements Lock, Serializable
ReentrantReadWriteLock.writeLock().- Начиная с:
- 1.5
- См. также:
Краткое описание конструкторов
| Модификатор | Конструктор | Описание |
|---|---|---|
protected |
Конструктор для использования подклассами. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
int |
getHoldCount() |
Определяет количество захватов этой блокировки записи текущим потоком. |
boolean |
isHeldByCurrentThread() |
Проверяет, удерживается ли эта блокировка записи текущим потоком. |
void |
lock() |
Захватывает блокировку записи. |
void |
lockInterruptibly() |
Захватывает блокировку записи, если текущий поток не прерван. |
Condition |
newCondition() |
|
String |
toString() |
Возвращает строку, идентифицирующую эту блокировку и ее состояние. |
boolean |
tryLock() |
Захватывает блокировку записи, только если на момент вызова она не удерживается другим потоком. |
boolean |
tryLock |
Захватывает блокировку записи, если в течение заданного времени ожидания она не удерживается другим потоком и текущий поток не был прерван. |
void |
unlock() |
Предпринимает попытку освободить эту блокировку. |
Подробное описание конструкторов
WriteLock
protected WriteLock(ReentrantReadWriteLock lock)
- Параметры:
-
lock— внешний объект блокировки - Исключения:
-
NullPointerException— если блокировка равна null
Подробное описание методов
lock
public void lock()
Захватывает блокировку записи, если ни блокировка чтения, ни блокировка записи не удерживается другим потоком, и немедленно возвращает управление, устанавливая счетчик захватов блокировки записи равным единице.
Если текущий поток уже удерживает блокировку записи, счетчик захватов увеличивается на единицу, и метод немедленно возвращает управление.
Если блокировку удерживает другой поток, текущий поток отключается от планирования и переходит в ожидание до тех пор, пока блокировка записи не будет захвачена; после этого счетчик захватов блокировки записи устанавливается равным единице.
lockInterruptibly
public void lockInterruptibly() throws InterruptedException
Захватывает блокировку записи, если ни блокировка чтения, ни блокировка записи не удерживается другим потоком, и немедленно возвращает управление, устанавливая счетчик захватов блокировки записи равным единице.
Если текущий поток уже удерживает эту блокировку, счетчик захватов увеличивается на единицу, и метод немедленно возвращает управление.
Если блокировку удерживает другой поток, текущий поток отключается от планирования и переходит в ожидание до наступления одного из двух событий:
- Текущий поток захватывает блокировку записи; или
- Другой поток прерывает текущий поток.
Если текущий поток захватывает блокировку записи, счетчик захватов блокировки устанавливается равным единице.
Если текущий поток:
- входит в этот метод с установленным флагом прерывания; или
- прерывается во время захвата блокировки записи,
InterruptedException, а флаг прерывания текущего потока сбрасывается. В этой реализации данный метод является явной точкой прерывания, поэтому обработка прерывания имеет приоритет над обычным или повторным захватом блокировки.
- Указано в:
-
lockInterruptiblyв интерфейсеLock - Исключения:
-
InterruptedException— если текущий поток прерван
tryLock
public boolean tryLock()
Захватывает блокировку записи, если ни блокировка чтения, ни блокировка записи не удерживается другим потоком, и немедленно возвращает значение true, устанавливая счетчик захватов блокировки записи равным единице. Даже если для этой блокировки задана политика справедливого упорядочивания, вызов tryLock() немедленно захватит блокировку, если она доступна, независимо от того, ожидают ли в данный момент другие потоки блокировку записи. Такое поведение, при котором поток получает преимущество, может быть полезно в некоторых случаях, несмотря на нарушение справедливости. Если необходимо соблюдать настройку справедливости этой блокировки, используйте tryLock(0, TimeUnit.SECONDS), который почти эквивалентен этому методу (он также обнаруживает прерывания).
Если текущий поток уже удерживает эту блокировку, счетчик захватов увеличивается на единицу, и метод возвращает true.
Если блокировку удерживает другой поток, этот метод немедленно возвращает значение false.
tryLock
public boolean tryLock(long timeout, TimeUnit unit) throws InterruptedException
Захватывает блокировку записи, если ни блокировка чтения, ни блокировка записи не удерживается другим потоком, и немедленно возвращает значение true, устанавливая счетчик захватов блокировки записи равным единице. Если для этой блокировки задана политика справедливого упорядочивания, доступная блокировка не будет захвачена, если другие потоки ожидают блокировку записи. Это отличается от метода tryLock(). Если требуется ограниченный по времени tryLock, допускающий получение преимущества при справедливой блокировке, используйте вместе варианты с тайм-аутом и без него:
if (lock.tryLock() ||
lock.tryLock(timeout, unit)) {
...
} Если текущий поток уже удерживает эту блокировку, счетчик захватов увеличивается на единицу, и метод возвращает true.
Если блокировку удерживает другой поток, текущий поток отключается от планирования и переходит в ожидание до наступления одного из трех событий:
- Текущий поток захватывает блокировку записи; или
- Другой поток прерывает текущий поток; или
- Истекает заданное время ожидания
Если блокировка записи захвачена, возвращается значение true, а счетчик захватов блокировки записи устанавливается равным единице.
Если текущий поток:
- входит в этот метод с установленным флагом прерывания; или
- прерывается во время захвата блокировки записи,
InterruptedException, а флаг прерывания текущего потока сбрасывается. Если заданное время ожидания истекает, возвращается значение false. Если время меньше или равно нулю, метод не будет ожидать.
В этой реализации данный метод является явной точкой прерывания, поэтому обработка прерывания имеет приоритет над обычным или повторным захватом блокировки, а также над сообщением об истечении времени ожидания.
- Указано в:
-
tryLockв интерфейсеLock - Параметры:
-
timeout— время ожидания блокировки записи -
unit— единица измерения времени аргумента тайм-аута - Возвращает:
-
true, если блокировка была свободна и захвачена текущим потоком либо блокировка записи уже удерживалась текущим потоком; иfalse, если время ожидания истекло до того, как блокировку удалось захватить. - Исключения:
-
InterruptedException— если текущий поток прерван -
NullPointerException— если единица измерения времени равна null
unlock
public void unlock()
Если текущий поток удерживает эту блокировку, счетчик захватов уменьшается. Если теперь счетчик захватов равен нулю, блокировка освобождается. Если текущий поток не удерживает эту блокировку, выбрасывается IllegalMonitorStateException.
- Указано в:
-
unlockв интерфейсеLock - Исключения:
-
IllegalMonitorStateException— если текущий поток не удерживает эту блокировку
newCondition
public Condition newCondition()
Condition для использования с этим экземпляром Lock. Возвращаемый экземпляр Condition поддерживает те же способы использования, что и методы монитора Object (wait, notify и notifyAll) при использовании со встроенной блокировкой монитора.
- Если эта блокировка записи не удерживается при вызове любого метода
Condition, выбрасываетсяIllegalMonitorStateException. (Блокировки чтения удерживаются независимо от блокировок записи, поэтому их не проверяют и они не затрагиваются. Однако вызов метода ожидания условия — практически всегда ошибка, если текущий поток также захватил блокировки чтения, поскольку другие потоки, которые могли бы его разблокировать, не смогут захватить блокировку записи.) - При вызове методов ожидания условия блокировка записи освобождается; перед возвратом метода она захватывается повторно, а счетчик захватов восстанавливается до значения, которое было при вызове метода.
- Если поток прерывается во время ожидания, ожидание прекращается, выбрасывается
InterruptedException, а флаг прерывания потока сбрасывается. - Ожидающие потоки получают сигнал в порядке FIFO.
- Порядок повторного захвата блокировки потоками, возвращающимися из методов ожидания, совпадает с порядком для потоков, изначально захватывающих блокировку. По умолчанию он не определен, но для справедливых блокировок предпочтение отдается потокам, которые ожидали дольше остальных.
- Указано в:
-
newConditionв интерфейсеLock - Возвращает:
- объект Condition
toString
public String toString()
"Unlocked" или строку "Locked by", за которой следует имя потока, удерживающего блокировку.isHeldByCurrentThread
public boolean isHeldByCurrentThread()
ReentrantReadWriteLock.isWriteLockedByCurrentThread().- Возвращает:
-
true, если текущий поток удерживает эту блокировку, иfalseв противном случае - Начиная с:
- 1.6
getHoldCount
public int getHoldCount()
ReentrantReadWriteLock.getWriteHoldCount().- Возвращает:
- количество захватов этой блокировки текущим потоком или ноль, если текущий поток не удерживает эту блокировку
- Начиная с:
- 1.6
© 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/ReentrantReadWriteLock.WriteLock.html