Класс ReentrantReadWriteLock.WriteLock
- java.lang.Object
-
- java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock
- Все реализованные интерфейсы:
-
Serializable,Lock
- Вложенный класс:
- ReentrantReadWriteLock
public static class ReentrantReadWriteLock.WriteLock extends Object implements Lock, Serializable
Блокировка, возвращаемая методом ReadWriteLock.writeLock().
- См. также:
- Сериализованная форма
Конструкторы
| Модификатор | Конструктор | Описание |
|---|---|---|
protected | WriteLock(ReentrantReadWriteLock lock) | Конструктор для использования подклассами. |
Методы
| Модификатор и тип | Метод | Описание |
|---|---|---|
int | getHoldCount() | Определяет количество удержаний этой блокировки записи текущим потоком. |
boolean | isHeldByCurrentThread() | Определяет, удерживается ли эта блокировка записи текущим потоком. |
void | lock() | Получает блокировку записи. |
void | lockInterruptibly() | Получает блокировку записи, если текущий поток не прерван. |
Condition | newCondition() | Возвращает экземпляр |
String | toString() | Возвращает строку, идентифицирующую эту блокировку и ее состояние. |
boolean | tryLock() | Получает блокировку записи только если она не удерживается другим потоком в момент вызова. |
boolean | tryLock(long timeout,
TimeUnit unit) | Получает блокировку записи, если она не удерживается другим потоком в течение заданного времени ожидания и текущий поток не был прерван. |
void | unlock() | Попытка освободить эту блокировку. |
Методы, объявленные в классе java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait Конструкторы
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в интерфейсеLock - Возвращает:
-
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", за которой следует имя владеющей нити.
- Переопределяет:
-
toStringв классеObject - Возвращает:
- строку, идентифицирующую эту блокировку, а также её состояние блокировки
isHeldByCurrentThread
public boolean isHeldByCurrentThread()
Запрашивает, удерживается ли эта блокировка записи текущей нитью. Эквивалентно ReentrantReadWriteLock.isWriteLockedByCurrentThread().
- Возвращает:
-
trueесли текущая нить удерживает эту блокировку иfalseв противном случае - С момента:
- 1.6
getHoldCount
public int getHoldCount()
Запрашивает количество удержаний этой блокировки записи текущей нитью. Поток удерживает блокировку для каждого действия блокировки, которое не соответствует действию разблокировки. Эквивалентно ReentrantReadWriteLock.getWriteHoldCount().
- Возвращает:
- количество удержаний этой блокировки текущей нитью или ноль, если эта блокировка не удерживается текущей нитью
- С момента:
- 1.6
© 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/util/concurrent/locks/ReentrantReadWriteLock.WriteLock.html