Класс 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()

Возвращает экземпляр Condition для использования с этим экземпляром Lock.

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()

Приобретает запись блокировки.

Приобретает блокировку записи, если ни чтение, ни запись блокировки не удерживаются другой нитью и возвращается немедленно, устанавливая счётчик удержания блокировки записи в единицу.

Если текущая нить уже удерживает блокировку записи, то счётчик удержания увеличивается на единицу, и метод возвращается немедленно.

Если блокировка удерживается другой нитью, то текущая нить отключается для планирования потоков и находится в спящем состоянии до тех пор, пока блокировка записи не будет приобретена, в этот момент счётчик удержания блокировки записи устанавливается в единицу.

Определено в:
lock в интерфейсе 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

Spec-Zone .ru
спецификации, руководства, описания, API