ILock Интерфейс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Lock
реализации обеспечивают более обширные операции блокировки, чем можно получить с помощью synchronized
методов и инструкций.
[Android.Runtime.Register("java/util/concurrent/locks/Lock", "", "Java.Util.Concurrent.Locks.ILockInvoker")]
public interface ILock : Android.Runtime.IJavaObject, IDisposable, Java.Interop.IJavaPeerable
[<Android.Runtime.Register("java/util/concurrent/locks/Lock", "", "Java.Util.Concurrent.Locks.ILockInvoker")>]
type ILock = interface
interface IJavaObject
interface IDisposable
interface IJavaPeerable
- Производный
- Атрибуты
- Реализации
Комментарии
Lock
реализации обеспечивают более обширные операции блокировки, чем можно получить с помощью synchronized
методов и инструкций. Они обеспечивают более гибкое структурирование, могут иметь совершенно разные свойства и могут поддерживать несколько связанных Condition
объектов.
Блокировка — это инструмент для управления доступом к общему ресурсу несколькими потоками. Как правило, блокировка обеспечивает монопольный доступ к общему ресурсу: только один поток за раз может получить блокировку, и для всего доступа к общему ресурсу необходимо сначала получить блокировку. Однако некоторые блокировки могут разрешать одновременный доступ к общему ресурсу, например блокировка ReadWriteLock
чтения .
Использование методов или инструкций synchronized
предоставляет доступ к неявной блокировке монитора, связанной с каждым объектом, но принудительно заставляет получать и освобождать все блокировки блочно: при получении нескольких блокировок они должны быть освобождены в обратном порядке, и все блокировки должны быть освобождены в том же лексическом область, в котором они были получены.
Хотя механизм определения области для synchronized
методов и операторов значительно упрощает программирование с блокировками монитора и помогает избежать многих распространенных ошибок программирования, связанных с блокировками, в некоторых случаях требуется работать с блокировками более гибким способом. Например, некоторые алгоритмы для обхода параллельных структур данных требуют использования " передача" или " блокировка цепочки": вы получаете блокировку узла A, затем узла B, затем освобождаете A и приобретаете C, затем освобождаете B, приобретаете D и т. д. Lock
Реализации интерфейса позволяют использовать такие методы, позволяя получать и освобождать блокировку в разных областях, а также получать и освобождать несколько блокировок в любом порядке.
С этой повышенной гибкостью приходит дополнительная ответственность. Отсутствие блокировки с блочно-структурированной блокировкой устраняет автоматическое снятие блокировок, возникающих с synchronized
методами и операторами. В большинстве случаев следует использовать следующую идиому:
{@code
Lock l = ...;
l.lock();
try {
// access the resource protected by this lock
} finally {
l.unlock();
}}
Когда блокировка и разблокировка происходят в разных областях, необходимо соблюдать осторожность, чтобы весь код, выполняемый во время блокировки, был защищен с помощью try-finally или try-catch, чтобы при необходимости блокировка была снята.
Lock
Реализации предоставляют дополнительные функциональные возможности по использованию методов и инструкций synchronized
, предоставляя неблокировочные попытки получить блокировку (#tryLock()
), попытку получить блокировку, которая может быть прервана (#lockInterruptibly
, и попытку получить блокировку, которая может истекать (#tryLock(long, TimeUnit)
).
Класс Lock
также может предоставлять поведение и семантику, которые сильно отличаются от поведения неявной блокировки монитора, например гарантированное упорядочение, использование без повторного входа или обнаружение взаимоблокировки. Если реализация предоставляет такую специализированную семантику, то реализация должна документировать эти семантики.
Обратите внимание, что Lock
экземпляры являются обычными объектами и сами могут использоваться в качестве целевого объекта в инструкции synchronized
. Получение блокировки монитора экземпляра не имеет указанной Lock
связи с вызовом #lock
любого из методов этого экземпляра. Во избежание путаницы рекомендуется никогда не использовать Lock
экземпляры таким образом, кроме как в их собственной реализации.
За исключением случаев, когда указано, передача null
значения для любого параметра приведет к возникновению NullPointerException
.
<h2>Синхронизация< памяти/h2>
Все реализации em must/em> принудительно применяют ту же семантику синхронизации памяти, что и встроенная блокировка монитора, как описано в главе 17 <раздела>Спецификация языка< Java/cite>: <ul><li>Успешная lock
операция имеет те же эффекты синхронизации памяти, что и успешное <действие em>Lock</em>.<><Lock
<Li>Успешная unlock
операция имеет те же эффекты синхронизации памяти, что и успешное <действие em>Unlock</em> . </ul>
Неудачные операции блокировки и разблокировки, а также повторное включение операций блокировки и разблокировки не требуют эффектов синхронизации памяти.
<h2>Вопросы< реализации/h2>
Три формы получения блокировок (прерываемые, не прерываемые и временные) могут отличаться по характеристикам производительности, гарантиям упорядочения или другим качествам реализации. Кроме того, возможность прерывания текущего><< или em-получения> блокировки может быть недоступна в данном Lock
классе. Следовательно, реализация не требуется определять точно одинаковые гарантии или семантику для всех трех форм получения блокировки, а также не требуется поддерживать прерывание текущего приобретения блокировки. Реализация требуется для четкого документирования семантики и гарантий, предоставляемых каждым из методов блокировки. Он также должен соответствовать семантике прерывания, как определено в этом интерфейсе, в той степени, в которой поддерживается прерывание получения блокировки: либо полностью, либо только при вводе метода.
Так как прерывание обычно подразумевает отмену, а проверки на прерывание часто выполняются нечасто, реализация может предпочещать реагирование на прерывание, а не обычный метод возврата. Это верно, даже если может показаться, что прерывание произошло после того, как другое действие могло разблокировать поток. Реализация должна документировать это поведение.
Добавлено в версии 1.5.
Документация по Java для java.util.concurrent.locks.Lock
.
Части этой страницы являются изменениями, основанными на работе, созданной и совместно используемой проектом и используемой в соответствии с условиями, Creative Commons 2.5 Attribution License Creative Commons 2.5 Attribution License.
Свойства
Handle |
Возвращает значение JNI базового объекта Android. (Унаследовано от IJavaObject) |
JniIdentityHashCode |
Возвращает значение для упаковаемого |
JniManagedPeerState |
Состояние управляемого однорангового узла. (Унаследовано от IJavaPeerable) |
JniPeerMembers |
Поддержка доступа и вызова участников. (Унаследовано от IJavaPeerable) |
PeerReference |
JniObjectReference Возвращает экземпляр объекта Java, заключенный в оболочку. (Унаследовано от IJavaPeerable) |
Методы
Disposed() |
Вызывается при удалении экземпляра. (Унаследовано от IJavaPeerable) |
DisposeUnlessReferenced() |
Если отсутствуют незадающиеся ссылки на этот экземпляр, вызывает |
Finalized() |
Вызывается после завершения работы экземпляра. (Унаследовано от IJavaPeerable) |
Lock() |
Получает блокировку. |
LockInterruptibly() |
Получает блокировку, если текущий поток не прерван Поток#прерывание. |
NewCondition() |
Возвращает новый |
SetJniIdentityHashCode(Int32) |
Задайте значение, возвращаемое . |
SetJniManagedPeerState(JniManagedPeerStates) |
|
SetPeerReference(JniObjectReference) |
Задайте значение, возвращаемое . |
TryLock() |
Получает блокировку, только если она свободна во время вызова. |
TryLock(Int64, TimeUnit) |
Получает блокировку, если она свободна в течение заданного времени ожидания и текущий поток не был прерван потоком#прерывание. |
Unlock() |
Снимает блокировку. |
UnregisterFromRuntime() |
Отмените регистрацию этого экземпляра, чтобы среда выполнения не возвращала его из будущих Java.Interop.JniRuntime+JniValueManager.PeekValue вызовов. (Унаследовано от IJavaPeerable) |
Методы расширения
JavaCast<TResult>(IJavaObject) |
Выполняет преобразование типа, проверенное средой выполнения Android. |
JavaCast<TResult>(IJavaObject) |
|
GetJniTypeName(IJavaPeerable) |
|