Класс 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().- Returns:
-
true, если текущая нить удерживает данный замок, иfalseв противном случае - Since:
- 1.6
getHoldCount
public int getHoldCount()
ReentrantReadWriteLock.getWriteHoldCount().- Returns:
- количество удержаний данного замка текущей нитью или ноль, если данный замок не удерживается текущей нитью
- Since:
- 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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/util/concurrent/locks/ReentrantReadWriteLock.WriteLock.html