Spec-Zone .ru
спецификации, руководства, описания, API
|
public interface Lock
Lock
реализации обеспечивают более обширные операции блокировки, чем можно получить, используя synchronized
методы и операторы. Они позволяют более гибкое структурирование, могут иметь очень отличающиеся свойства, и могут поддерживать многократный связанный Condition
объекты. Блокировка является инструментом для того, чтобы управлять доступом к совместно используемому ресурсу многократными потоками. Обычно, блокировка обеспечивает эксклюзивный доступ к совместно используемому ресурсу: только один поток за один раз может получить блокировку, и весь доступ к совместно используемому ресурсу требует, чтобы блокировка была получена сначала. Однако, некоторые блокировки могут предоставить параллельный доступ к совместно используемому ресурсу, такому как блокировка чтения a ReadWriteLock
.
Использование synchronized
методы или операторы обеспечивают доступ к неявной блокировке монитора, связанной с каждым объектом, но вынуждают весь сбор блокировки и выпуск произойти блочно-структурированным способом: когда многократные блокировки получаются, они должны быть выпущены в противоположном порядке, и все блокировки должны быть выпущены в том же самом лексическом контексте, в котором они были получены.
В то время как механизм определения контекста для synchronized
методы и операторы делают это намного легче к программе с блокировками монитора, и помогают избежать многих общих ошибок программирования, включающих блокировки, есть случаи, где Вы должны работать с, привязывает более гибкий путь. Например, некоторые алгоритмы для того, чтобы пересечь структуры данных, к которым одновременно получают доступ, требуют использования "руки по руке" или "блокировки цепочки": Вы получаете блокировку узла A, тогда узел B, тогда выпуск A и получаете C, тогда выпуск B и получаете D и так далее. Реализации Lock
взаимодействуйте через интерфейс включают использованию таких методов, позволяя блокировку быть полученными и выпущенными в различных контекстах, и позволяя многократные блокировки быть полученными и выпущенными в любом порядке.
С этой увеличенной гибкостью прибывает дополнительная ответственность. Отсутствие блочно-структурированной блокировки удаляет автоматический выпуск блокировок, который происходит с synchronized
методы и операторы. В большинстве случаев следующая идиома должна использоваться:
Lock l = ...; l.lock(); try { // access the resource protected by this lock } finally { l.unlock(); }Когда блокировка и разблокирование происходят в различных контекстах, забота должна быть проявлена, чтобы гарантировать, что весь код, который выполняется, в то время как блокировка сохранена, защищается попыткой наконец или выгодой попытки, чтобы гарантировать, что блокировка выпускается когда необходимо.
Lock
реализации обеспечивают дополнительную функциональность по использованию synchronized
методы и операторы, обеспечивая неблокирование пытаются получить блокировку (tryLock()
), попытка получить блокировку, которая может быть прервана (lockInterruptibly()
, и попытка получить блокировку, которая может тайм-аут (tryLock(long, TimeUnit)
).
A Lock
класс может также обеспечить поведение и семантику, которая очень отличается от той из неявной блокировки монитора, такой как гарантирующийся упорядочивание, неповторно используемое использование, или обнаружение мертвой блокировки. Если реализация обеспечивает такую специализированную семантику тогда, реализация должна задокументировать тех семантика.
Отметьте это Lock
экземпляры являются только нормальными объектами и могут самостоятельно использоваться в качестве цели в a synchronized
оператор. Получение блокировки монитора a Lock
у экземпляра нет никакого указанного отношения с вызовом любого из lock()
методы того экземпляра. Рекомендуется, чтобы, чтобы избежать беспорядка Вы никогда не использовали Lock
экземпляры таким образом, кроме в пределах их собственной реализации.
Кроме где отмечено, передавая a null
значение для любого параметра приведет к a NullPointerException
быть брошенным.
Все Lock
реализации должны осуществить ту же самую семантику синхронизации памяти в соответствии со встроенной блокировкой монитора, как описано в разделе 17.4 из Спецификации языка Java™:
lock
работа имеет те же самые эффекты синхронизации памяти как успешное действие Блокировки. unlock
работа имеет те же самые эффекты синхронизации памяти, как успешное Разблокировало действие. Три формы сбора блокировки (прерывистая, непрерывистая, и синхронизированный) могут отличаться по их показателям производительности, упорядочивая гарантии, или другие качества реализации. Далее, возможность прервать продолжающийся сбор блокировки, возможно, не доступна в данном Lock
класс. Следовательно, реализация не обязана определять точно те же самые гарантии или семантику для всех трех форм сбора блокировки, и при этом это не требуется поддерживать прерывание продолжающегося сбора блокировки. Реализация обязана ясно документировать семантику и гарантии, обеспеченные каждым из методов блокировки. Это должно также повиноваться семантике прерывания как определено в этом интерфейсе, до такой степени, что прерывание сбора блокировки поддерживается: который является или полностью, или только на записи метода.
Поскольку прерывание обычно подразумевает отмену, и проверяет на прерывание, являются часто нечастыми, реализация может одобрить отвечание на прерывание по нормальному возврату метода. Это - истина, даже если можно показать, что прерывание произошло после того, как другое действие, возможно, разблокировало поток. Реализация должна задокументировать это поведение.
ReentrantLock
, Condition
, ReadWriteLock
Модификатор и Тип | Метод и Описание |
---|---|
void |
lock()
Получает блокировку.
|
void |
lockInterruptibly()
Получает блокировку, если текущий поток не прерывается.
|
Условие |
newCondition()
Возвращает новое
Condition экземпляр, который связывается с этим Lock экземпляр. |
boolean |
tryLock()
Получает блокировку, только если это свободно во время вызова.
|
boolean |
tryLock(long time, TimeUnit unit)
Получает блокировку, если это свободно в пределах данного времени ожидания, и текущий поток не был прерван.
|
void |
unlock()
Выпускает блокировку.
|
void lock()
Если блокировка не доступна тогда, текущий поток становится отключенным в целях планирования потоков и бездействует, пока блокировка не была получена.
Соображения реализации
A Lock
реализация может быть в состоянии обнаружить ошибочное использование блокировки, такой как вызов, который вызвал бы мертвую блокировку, и может выдать исключение (непроверенное) при таких обстоятельствах. Обстоятельства и тип исключения должны быть задокументированы этим Lock
реализация.
void lockInterruptibly() throws InterruptedException
Получает блокировку, если это доступно и сразу возвращается.
Если блокировка не доступна тогда, текущий поток становится отключенным в целях планирования потоков и бездействует, пока одна из двух вещей не происходит:
Если текущий поток:
InterruptedException
бросается и прерванное состояние текущего потока очищается. Соображения реализации
Возможность прервать сбор блокировки в некоторых реализациях, возможно, не возможна, и если возможный может быть дорогой работой. Программист должен знать, что это может иметь место. Реализация должна задокументировать когда дело обстоит так.
Реализация может одобрить отвечание на прерывание по нормальному возврату метода.
A Lock
реализация может быть в состоянии обнаружить ошибочное использование блокировки, такой как вызов, который вызвал бы мертвую блокировку, и может выдать исключение (непроверенное) при таких обстоятельствах. Обстоятельства и тип исключения должны быть задокументированы этим Lock
реализация.
InterruptedException
- если текущий поток прерывается, получая блокировку (и прерывание сбора блокировки поддерживается).boolean tryLock()
Получает блокировку, если это доступно и сразу возвращается со значением true
. Если блокировка не будет доступна тогда, то этот метод сразу возвратится со значением false
.
Типичная идиома использования для этого метода была бы:
Lock lock = ...; if (lock.tryLock()) { try { // manipulate protected state } finally { lock.unlock(); } } else { // perform alternative actions }Это использование гарантирует, что блокировка разблокирована, если это было получено, и не пытается разблокировать, если блокировка не была получена.
true
если блокировка была получена и false
иначеboolean tryLock(long time, TimeUnit unit) throws InterruptedException
Если блокировка доступна, этот метод сразу возвращается со значением true
. Если блокировка не доступна тогда, текущий поток становится отключенным в целях планирования потоков и бездействует, пока одна из трех вещей не происходит:
Если блокировка получается тогда значение true
возвращается.
Если текущий поток:
InterruptedException
бросается и прерванное состояние текущего потока очищается. Если указанное время ожидания протекает тогда значение false
возвращается. Если время будет меньше чем или равно нулю, то метод не будет ожидать вообще.
Соображения реализации
Возможность прервать сбор блокировки в некоторых реализациях, возможно, не возможна, и если возможный может быть дорогой работой. Программист должен знать, что это может иметь место. Реализация должна задокументировать когда дело обстоит так.
Реализация может одобрить отвечание на прерывание по нормальному возврату метода, или созданию отчетов о тайм-ауте.
A Lock
реализация может быть в состоянии обнаружить ошибочное использование блокировки, такой как вызов, который вызвал бы мертвую блокировку, и может выдать исключение (непроверенное) при таких обстоятельствах. Обстоятельства и тип исключения должны быть задокументированы этим Lock
реализация.
time
- максимальное время, чтобы ожидать блокировкиunit
- единица измерения времени time
параметрtrue
если блокировка была получена и false
если время ожидания, законченное перед блокировкой, было полученоInterruptedException
- если текущий поток прерывается, получая блокировку (и прерывание сбора блокировки поддерживается),void unlock()
Соображения реализации
A Lock
реализация будет обычно вводить ограничения, на которых поток может выпустить блокировку (обычно, только держатель блокировки может выпустить это), и может выдать исключение (непроверенное), если ограничение нарушается. Любые ограничения и тип исключения должны быть задокументированы этим Lock
реализация.
Condition newCondition()
Condition
экземпляр, который связывается с этим Lock
экземпляр. Прежде, чем ожидать на условии блокировка должна быть сохранена текущим потоком. Звонок Condition.await()
атомарно выпустит блокировку прежде, чем ожидать и повторно получит блокировку перед ожидать возвратами.
Соображения реализации
Точная работа Condition
экземпляр зависит от Lock
реализация и должна быть задокументирована той реализацией.
Condition
экземпляр для этого Lock
экземплярUnsupportedOperationException
- если это Lock
реализация не поддерживает условия
Для дальнейшей ссылки API и документации разработчика, см.
Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.