Класс ReentrantReadWriteLock.WriteLock
- java.lang.Object
-
- java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock
- Все реализованные интерфейсы:
- Serializable, Lock
- Вложенный класс:
- ReentrantReadWriteLock
public static class ReentrantReadWriteLock.WriteLock extends Object implements Lock, Serializable
Блокировка, возвращаемая методом ReentrantReadWriteLock.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.