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();
}}
При блокировке и разблокировке в разных областях необходимо обеспечить защиту всего кода, выполняемого при сохранении блокировки, путем попытки или попытки перехвата, чтобы гарантировать, что блокировка освобождается при необходимости.
Lock реализации предоставляют дополнительные функциональные возможности по использованию synchronized методов и инструкций, предоставляя неблокирующие попытки получить блокировку (#tryLock()), попытку получить блокировку, которая может быть прервана (#lockInterruptiblyи попытка получить блокировку, которая может тайм-аут (#tryLock(long, TimeUnit)).
Класс Lock также может предоставлять поведение и семантику, которая отличается от неявной блокировки монитора, например гарантированное упорядочение, не повторное использование или обнаружение взаимоблокировки. Если реализация предоставляет такие специализированные семантики, реализация должна документирует эти семантики.
Обратите внимание, что Lock экземпляры являются обычными объектами и могут использоваться в качестве целевого объекта в инструкции synchronized . При получении блокировки монитора экземпляра Lock нет указанной связи с вызовом любого из #lock методов этого экземпляра. Рекомендуется избежать путаницы, которую никогда не использовать Lock экземпляры таким образом, за исключением собственной реализации.
За исключением того, где указано, передача null значения для любого параметра приведет к возникновению NullPointerException ошибки.
<Синхронизация> памяти h2</h2>
Все реализации em должны/emLock применять ту же семантику синхронизации памяти, что и встроенная блокировка монитора, как описано в главе 17 <cite>The Java Language Specification</cite>: <ul><li>A успешной операции имеет те же эффекты синхронизации памяти, что и успешное <>действие em<Lock>/em.lock<><>
<li>Успешная unlock операция имеет те же эффекты синхронизации памяти, что и успешное <действие em>Unlock</em> .
</ul>
Неудачные операции блокировки и разблокировки, а также повторные операции блокировки и разблокировки не требуют никаких эффектов синхронизации памяти.
<Рекомендации по> реализации h2</h2>
Три формы приобретения блокировки (прерываемые, не прерываемые и сроки) могут отличаться в своих характеристиках производительности, гарантиях упорядочивания или других качествах реализации. Кроме того, возможность прерывания <>непрерывного< или эм-приобретения> блокировки может быть недоступна в данном Lock классе. Следовательно, реализация не требуется для определения точно одинаковых гарантий или семантики для всех трех форм приобретения блокировки, а также не требуется для поддержки прерывания непрерывного приобретения блокировки. Реализация требуется для четкого документирования семантики и гарантий, предоставляемых каждым из методов блокировки. Кроме того, он должен соответствовать семантике прерывания, как определено в этом интерфейсе, в том случае, если прерывание приобретения блокировки поддерживается: это либо полностью, либо только при вводе метода.
Как правило, прерывание подразумевает отмену и проверки прерывания часто нечасто, реализация может благоприятствуть реагированию на прерывание по сравнению с нормальным возвратом метода. Это верно, даже если можно показать, что прерывание произошло после того, как другое действие может разблокировать поток. Реализация должна документировать это поведение.
Добавлено в версии 1.5.
Java документации по java.util.concurrent.locks.Lock.
Части этой страницы — это изменения на основе работы, созданной и общей Project и используемых в соответствии с условиями, описанными в разделе "".
Свойства
| Имя. | Описание |
|---|---|
| Handle |
Возвращает значение JNI базового объекта Android. (Унаследовано от IJavaObject) |
| JniIdentityHashCode |
Возвращает значение |
| JniManagedPeerState |
Состояние управляемого однорангового узла. (Унаследовано от IJavaPeerable) |
| JniObjectReferenceControlBlock |
|
| 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) |
Методы расширения
| Имя. | Описание |
|---|---|
| GetJniTypeName(IJavaPeerable) |
Возвращает имя JNI типа экземпляра |
| JavaAs<TResult>(IJavaPeerable) |
Попробуйте принуждать к типу |
| JavaCast<TResult>(IJavaObject) |
Выполняет преобразование типа, проверяемого средой выполнения Android. |
| JavaCast<TResult>(IJavaObject) |
|
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
Попробуйте принуждать к типу |