Spec-Zone .ru
спецификации, руководства, описания, API
|
public class ReentrantLock extends Object implements Lock, Serializable
Lock
с тем же самым основным поведением и семантикой, поскольку неявная блокировка монитора получила доступ к использованию synchronized
методы и операторы, но с расширенными возможностями. A ReentrantLock
принадлежит потоку, последнему успешно блокировка, но еще разблокирование этого. Вызов потока lock
возвратится, успешно получая блокировку, когда блокировка не принадлежит другому потоку. Метод сразу возвратится, если текущему потоку уже будет принадлежать блокировка. Это может быть проверено, используя методы isHeldByCurrentThread()
, и getHoldCount()
.
Конструктор для этого класса принимает дополнительный параметр справедливости. Когда установлено true
, в соответствии с конкуренцией, доступом предоставляющего пользы блокировок к дольше всего ожидающему потоку. Иначе эта блокировка не гарантирует определенного порядка доступа. Программы используя справедливые блокировки, к которым получают доступ много потоков, могут вывести на экран более низкую полную пропускную способность (то есть, медленнее; часто намного медленнее) чем те, которые используют настройку по умолчанию, но, имеют меньшие различия во времена, чтобы получить блокировки и нехватку гарантии исчерпания ресурсов. Отметьте однако, та справедливость блокировок не гарантирует справедливости планирования потоков. Таким образом один из многих потоков, используя справедливую блокировку может получить это многократно по очереди, в то время как другие активные потоки не прогрессируют и не в настоящий момент содержат блокировку. Также отметьте что несинхронизированное tryLock
метод не соблюдает установку справедливости. Это успешно выполнится, если блокировка будет доступна, даже если другие потоки ожидают.
Рекомендуется, чтобы практика ко всегда сразу следовала за звонком lock
с a try
блок, наиболее обычно в перед/после того, как конструкцией, такой как:
class X { private final ReentrantLock lock = new ReentrantLock(); // ... public void m() { lock.lock(); // block until condition holds try { // ... method body } finally { lock.unlock() } } }
В дополнение к реализации Lock
интерфейс, этот класс определяет методы isLocked
и getLockQueueLength
, так же как некоторые связались protected
методы доступа, которые могут быть полезными для инструментария и контроля.
Сериализация этого класса ведет себя таким же образом как встроенные блокировки: десериализованная блокировка находится в разблокированном состоянии, независимо от его состояния когда сериализировано.
Эта блокировка поддерживает максимум 2147483647 рекурсивных блокировок тем же самым потоком. Попытки превысить этот предел приводят к Error
броски от блокировки методов.
Конструктор и Описание |
---|
ReentrantLock()
Создает экземпляр
ReentrantLock . |
ReentrantLock(boolean fair)
Создает экземпляр
ReentrantLock с данной политикой справедливости. |
Модификатор и Тип | Метод и Описание |
---|---|
int |
getHoldCount()
Запрашивает число, держится эта блокировка текущим потоком.
|
protected Thread |
getOwner()
Возвращает поток, которому в настоящий момент принадлежит эта блокировка, или
null если не принадлежавший. |
protected Collection<Thread> |
getQueuedThreads()
Возвращает набор, содержащий потоки, которые могут ожидать, чтобы получить эту блокировку.
|
int |
getQueueLength()
Возвращает оценку числа потоков, ожидающих, чтобы получить эту блокировку.
|
protected Collection<Thread> |
getWaitingThreads(Condition condition)
Возвращает набор, содержащий те потоки, которые могут ожидать на данном условии, связанном с этой блокировкой.
|
int |
getWaitQueueLength(Condition condition)
Возвращает оценку числа потоков, ожидающих на данном условии, связанном с этой блокировкой.
|
boolean |
hasQueuedThread(Thread thread)
Запросы, ожидает ли данный поток, чтобы получить эту блокировку.
|
boolean |
hasQueuedThreads()
Запросы, ожидают ли какие-либо потоки, чтобы получить эту блокировку.
|
boolean |
hasWaiters(Condition condition)
Запросы, ожидают ли какие-либо потоки на данном условии, связанном с этой блокировкой.
|
boolean |
isFair()
Возвраты
true если у этой блокировки есть истина набора справедливости. |
boolean |
isHeldByCurrentThread()
Запросы, если эта блокировка сохранена текущим потоком.
|
boolean |
isLocked()
Запросы, если эта блокировка сохранена каким-либо потоком.
|
void |
lock()
Получает блокировку.
|
void |
lockInterruptibly()
Получает блокировку, если текущий поток не прерывается.
|
Условие |
newCondition()
|
Строка |
toString()
Возвращает строку, идентифицирующую эту блокировку, так же как ее состояние блокировки.
|
boolean |
tryLock()
Получает блокировку, только если она не сохранена другим потоком во время вызова.
|
boolean |
tryLock(long timeout, TimeUnit unit)
Получает блокировку, если она не сохранена другим потоком в пределах данного времени ожидания, и текущий поток не был прерван.
|
void |
unlock()
Попытки выпустить эту блокировку.
|
public ReentrantLock()
ReentrantLock
. Это эквивалентно использованию ReentrantLock(false)
.public ReentrantLock(boolean fair)
ReentrantLock
с данной политикой справедливости.fair
- true
если эта блокировка должна использовать справедливую политику упорядочиванияpublic void lock()
Получает блокировку, если она не сохранена другим потоком и сразу возвращается, устанавливая блокировку содержит количество одному.
Если текущий поток уже содержит блокировку тогда, количество хранения постепенно увеличивается одним, и метод сразу возвращается.
Если блокировка сохранена другим потоком тогда, текущий поток становится отключенным в целях планирования потоков и бездействует, пока блокировка не была получена, в котором времени блокировка содержат количество, устанавливается в одного.
public void lockInterruptibly() throws InterruptedException
Получает блокировку, если она не сохранена другим потоком и сразу возвращается, устанавливая блокировку содержит количество одному.
Если текущий поток уже содержит эту блокировку тогда, количество хранения постепенно увеличивается одним, и метод сразу возвращается.
Если блокировка сохранена другим потоком тогда, текущий поток становится отключенным в целях планирования потоков и бездействует, пока одна из двух вещей не происходит:
Если блокировка получается текущим потоком тогда, блокировка содержит количество, устанавливается в одного.
Если текущий поток:
InterruptedException
бросается и прерванное состояние текущего потока очищается. В этой реализации, поскольку этот метод является явной точкой прерывания, предпочтение дается отвечанию на прерывание по нормальному или повторно используемому сбору блокировки.
lockInterruptibly
в интерфейсе Lock
InterruptedException
- если текущий поток прерываетсяpublic boolean tryLock()
Получает блокировку, если она не сохранена другим потоком и сразу возвращается со значением true
, установка блокировки содержит количество одному. Даже когда эта блокировка была установлена использовать справедливую политику упорядочивания, звонок tryLock()
сразу получит блокировку, если это будет доступно, ожидают ли другие потоки в настоящий момент блокировки. Это поведение "неуклюжей походки" может быть полезным при определенных обстоятельствах, даже при том, что оно повреждает справедливость. Если Вы хотите соблюдать установку справедливости для этой блокировки, то используйте tryLock(0, TimeUnit.SECONDS)
который почти эквивалентен (это также обнаруживает прерывание).
Если текущий поток уже содержит эту блокировку тогда, количество хранения постепенно увеличивается одним и возвратами метода true
.
Если блокировка будет сохранена другим потоком тогда, то этот метод сразу возвратится со значением false
.
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
- если единица измерения времени является нулемpublic void unlock()
Если текущий поток является держателем этой блокировки тогда, количество хранения постепенно уменьшается. Если количество хранения является теперь нулем тогда, блокировка выпускается. Если текущий поток не является держателем этой блокировки тогда IllegalMonitorStateException
бросается.
unlock
в интерфейсе Lock
IllegalMonitorStateException
- если текущий поток не содержит эту блокировкуpublic Condition newCondition()
Condition
экземпляр для использования с этим Lock
экземпляр. Возвращенный Condition
экземпляр поддерживает те же самые использования также, как и Object
методы монитора (wait
, notify
, и notifyAll
) когда использующийся со встроенной блокировкой монитора.
Condition
ожидание или сигнальные методы вызывают, то IllegalMonitorStateException
бросается. InterruptedException
будет брошен, и прерванное состояние потока будет очищено. newCondition
в интерфейсе Lock
public int getHoldCount()
У потока есть держание блокировки для каждого действия блокировки, которое не является соответствующим разблокировать действием.
Информация о количестве хранения обычно только используется для тестирования и отладки целей. Например, если определенный раздел кода не должен быть введен с блокировкой, уже сохраненной тогда, мы можем утверждать что факт:
class X { ReentrantLock lock = new ReentrantLock(); // ... public void m() { assert lock.getHoldCount() == 0; lock.lock(); try { // ... method body } finally { lock.unlock(); } } }
public boolean isHeldByCurrentThread()
Аналогичный Thread.holdsLock(java.lang.Object)
метод для встроенных блокировок монитора, этот метод обычно используется для отладки и тестирования. Например, метод, который нужно только вызвать, в то время как блокировка сохранена, может утверждать что дело обстоит так:
class X { ReentrantLock lock = new ReentrantLock(); // ... public void m() { assert lock.isHeldByCurrentThread(); // ... method body } }
Это может также использоваться, чтобы гарантировать, что повторно используемая блокировка используется неповторно используемым способом, например:
class X { ReentrantLock lock = new ReentrantLock(); // ... public void m() { assert !lock.isHeldByCurrentThread(); lock.lock(); try { // ... method body } finally { lock.unlock(); } } }
true
если текущий поток содержит эту блокировку и false
иначеpublic boolean isLocked()
true
если какой-либо поток содержит эту блокировку и false
иначеpublic final boolean isFair()
true
если у этой блокировки есть истина набора справедливости.true
если у этой блокировки есть истина набора справедливостиprotected Thread getOwner()
null
если не принадлежавший. Когда этот метод вызывает поток, который не является владельцем, возвращаемое значение отражает приближение максимальных усилий текущего состояния блокировки. Например, владелец может быть на мгновение null
даже если есть потоки, пытающиеся получать блокировку, но еще не сделали так. Этот метод разрабатывается, чтобы облегчить конструкцию подклассов, которые предоставляют более обширные контрольные услуги блокировки.null
если не принадлежавшийpublic final boolean hasQueuedThreads()
true
возврат не гарантирует, что любой другой поток будет когда-либо получать эту блокировку. Этот метод разрабатывается прежде всего для использования в контроле системного состояния.true
если могут быть другие потоки, ожидающие, чтобы получить блокировкуpublic final boolean hasQueuedThread(Thread thread)
true
возврат не гарантирует, что этот поток будет когда-либо получать эту блокировку. Этот метод разрабатывается прежде всего для использования в контроле системного состояния.thread
- потокtrue
если данный поток ставится в очередь, ожидая этой блокировкиNullPointerException
- если поток является нулемpublic final int getQueueLength()
protected Collection<Thread> getQueuedThreads()
public boolean hasWaiters(Condition condition)
true
возврат не гарантирует что будущее signal
пробудит любые потоки. Этот метод разрабатывается прежде всего для использования в контроле системного состояния.condition
- условиеtrue
если есть какие-либо потоки ожиданияIllegalMonitorStateException
- если эта блокировка не сохраненаIllegalArgumentException
- если данное условие не связывается с этой блокировкойNullPointerException
- если условие является нулемpublic int getWaitQueueLength(Condition condition)
condition
- условиеIllegalMonitorStateException
- если эта блокировка не сохраненаIllegalArgumentException
- если данное условие не связывается с этой блокировкойNullPointerException
- если условие является нулемprotected Collection<Thread> getWaitingThreads(Condition condition)
condition
- условиеIllegalMonitorStateException
- если эта блокировка не сохраненаIllegalArgumentException
- если данное условие не связывается с этой блокировкойNullPointerException
- если условие является нулем
Для дальнейшей ссылки API и документации разработчика, см.
Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.