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

Возвращает значение для упаковаемого java.lang.System.identityHashCode() экземпляра.

(Унаследовано от IJavaPeerable)
JniManagedPeerState

Состояние управляемого однорангового узла.

(Унаследовано от IJavaPeerable)
JniPeerMembers

Поддержка доступа и вызова участников.

(Унаследовано от IJavaPeerable)
PeerReference

JniObjectReference Возвращает экземпляр объекта Java, заключенный в оболочку.

(Унаследовано от IJavaPeerable)

Методы

Disposed()

Вызывается при удалении экземпляра.

(Унаследовано от IJavaPeerable)
DisposeUnlessReferenced()

Если отсутствуют незадающиеся ссылки на этот экземпляр, вызывает Dispose(); в противном случае ничего не делает.

(Унаследовано от IJavaPeerable)
Finalized()

Вызывается после завершения работы экземпляра.

(Унаследовано от IJavaPeerable)
Lock()

Получает блокировку.

LockInterruptibly()

Получает блокировку, если текущий поток не прерван Поток#прерывание.

NewCondition()

Возвращает новый Condition экземпляр, привязанный к этому Lock экземпляру.

SetJniIdentityHashCode(Int32)

Задайте значение, возвращаемое .JniIdentityHashCode

(Унаследовано от IJavaPeerable)
SetJniManagedPeerState(JniManagedPeerStates)

Lock реализации обеспечивают более обширные операции блокировки, чем можно получить с помощью synchronized методов и инструкций.

(Унаследовано от IJavaPeerable)
SetPeerReference(JniObjectReference)

Задайте значение, возвращаемое .PeerReference

(Унаследовано от IJavaPeerable)
TryLock()

Получает блокировку, только если она свободна во время вызова.

TryLock(Int64, TimeUnit)

Получает блокировку, если она свободна в течение заданного времени ожидания и текущий поток не был прерван потоком#прерывание.

Unlock()

Снимает блокировку.

UnregisterFromRuntime()

Отмените регистрацию этого экземпляра, чтобы среда выполнения не возвращала его из будущих Java.Interop.JniRuntime+JniValueManager.PeekValue вызовов.

(Унаследовано от IJavaPeerable)

Методы расширения

JavaCast<TResult>(IJavaObject)

Выполняет преобразование типа, проверенное средой выполнения Android.

JavaCast<TResult>(IJavaObject)

Lock реализации обеспечивают более обширные операции блокировки, чем можно получить с помощью synchronized методов и инструкций.

GetJniTypeName(IJavaPeerable)

Lock реализации обеспечивают более обширные операции блокировки, чем можно получить с помощью synchronized методов и инструкций.

Применяется к