|
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 class может также обеспечить поведение и семантику, которая очень отличается от той из неявной блокировки монитора, такой как гарантирующийся упорядочивание, неповторно используемое использование, или обнаружение мертвой блокировки. Если реализация обеспечивает такую специализированную семантику тогда, реализация должна задокументировать тех семантика.
Отметьте это Lock экземпляры являются только нормальными объектами и могут самостоятельно использоваться в качестве цели в a synchronized оператор. Получение блокировки монитора a Lock у экземпляра нет никакого указанного отношения с вызовом любого из lock() методы того экземпляра. Рекомендуется, чтобы, чтобы избежать беспорядка Вы никогда не использовали Lock экземпляры таким образом, кроме в пределах их собственной реализации.
Кроме где отмечено, передавая a null значение для любого параметра приведет к a NullPointerException быть брошенным.
Все Lock реализации должны осуществить ту же самую семантику синхронизации памяти в соответствии со встроенной блокировкой монитора, как описано в :
lock работа имеет те же самые эффекты синхронизации памяти как успешное действие Блокировки. unlock работа имеет те же самые эффекты синхронизации памяти, как успешное Разблокировало действие. Три формы сбора блокировки (прерывистая, непрерывистая, и синхронизированный) могут отличаться по их показателям производительности, упорядочивая гарантии, или другие качества реализации. Далее, возможность прервать продолжающийся сбор блокировки, возможно, не доступна в данном Lock class. Следовательно, реализация не обязана определять точно те же самые гарантии или семантику для всех трех форм сбора блокировки, и при этом это не требуется поддерживать прерывание продолжающегося сбора блокировки. Реализация обязана ясно документировать семантику и гарантии, обеспеченные каждым из методов блокировки. Это должно также повиноваться семантике прерывания как определено в этом интерфейсе, до такой степени, что прерывание сбора блокировки поддерживается: который является или полностью, или только на записи метода.
Поскольку прерывание обычно подразумевает отмену, и проверяет на прерывание, являются часто нечастыми, реализация может одобрить отвечание на прерывание по нормальному возврату метода. Это - истина, даже если можно показать, что прерывание произошло после того, как другое действие, возможно, разблокировало поток. Реализация должна задокументировать это поведение.
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 и документации разработчика, см. Java Документация SE. Та документация содержит более подробные, предназначенные разработчиком описания, с концептуальными краткими обзорами, определениями сроков, обходных решений, и рабочих примеров кода.
Авторское право © 1993, 2013, Oracle и/или его филиалы. Все права защищены.
Проект сборка-b92