Condividi tramite


ILock Interfaccia

Definizione

Lock le implementazioni forniscono operazioni di blocco più estese di quanto sia possibile ottenere usando synchronized metodi e istruzioni.

[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
Derivato
Attributi
Implementazioni

Commenti

Lock le implementazioni forniscono operazioni di blocco più estese di quanto sia possibile ottenere usando synchronized metodi e istruzioni. Consentono una struttura più flessibile, possono avere proprietà molto diverse e possono supportare più oggetti associati Condition .

Un blocco è uno strumento per controllare l'accesso a una risorsa condivisa da più thread. In genere, un blocco fornisce accesso esclusivo a una risorsa condivisa: un solo thread alla volta può acquisire il blocco e tutto l'accesso alla risorsa condivisa richiede che il blocco venga acquisito per primo. Tuttavia, alcuni blocchi possono consentire l'accesso simultaneo a una risorsa condivisa, ad esempio il blocco di lettura di un oggetto ReadWriteLock.

L'uso di synchronized metodi o istruzioni fornisce l'accesso al blocco di monitoraggio implicito associato a ogni oggetto, ma forza l'acquisizione e il rilascio di blocchi in modo strutturato: quando vengono acquisiti più blocchi, devono essere rilasciati nell'ordine opposto e tutti i blocchi devono essere rilasciati nello stesso ambito lessicale in cui sono stati acquisiti.

Anche se il meccanismo di definizione dell'ambito per synchronized metodi e istruzioni rende molto più semplice programmare con blocchi di monitoraggio e consente di evitare molti errori di programmazione comuni che coinvolgono blocchi, in alcuni casi è necessario usare i blocchi in modo più flessibile. Ad esempio, alcuni algoritmi per attraversare strutture di dati con accesso simultaneo richiedono l'uso di &virgolette; consegna di mano&virgolette; o &virgolette; blocco catena": si acquisisce il blocco del nodo A, quindi il nodo B, quindi rilasciare A e acquisire C, quindi rilasciare B e acquisire D e così via. Le implementazioni dell'interfaccia consentono l'uso Lock di tali tecniche consentendo l'acquisizione e il rilascio di un blocco in ambiti diversi e consentendo l'acquisizione e il rilascio di più blocchi in qualsiasi ordine.

Con questa maggiore flessibilità si assume una responsabilità aggiuntiva. L'assenza di blocco strutturato rimuove il rilascio automatico dei blocchi che si verifica con synchronized metodi e istruzioni. Nella maggior parte dei casi, è necessario usare il linguaggio seguente:

{@code
            Lock l = ...;
            l.lock();
            try {
              // access the resource protected by this lock
            } finally {
              l.unlock();
            }}

Quando il blocco e lo sblocco si verificano in ambiti diversi, è necessario prestare attenzione a garantire che tutto il codice eseguito mentre il blocco venga mantenuto protetto da try-finally o try-catch per assicurarsi che il blocco venga rilasciato quando necessario.

Lock le implementazioni forniscono funzionalità aggiuntive sull'uso di synchronized metodi e istruzioni fornendo un tentativo non bloccante di acquisire un blocco (#tryLock()), un tentativo di acquisire il blocco che può essere interrotto (#lockInterruptiblye un tentativo di acquisire il blocco che può verificarsi il timeout (#tryLock(long, TimeUnit)).

Una Lock classe può anche fornire comportamento e semantica molto diverso da quello del blocco di monitoraggio implicito, ad esempio l'ordinamento garantito, l'utilizzo non reentrante o il rilevamento di deadlock. Se un'implementazione fornisce una semantica così specializzata, l'implementazione deve documentare tali semantiche.

Si noti che Lock le istanze sono solo oggetti normali e possono essere usate come destinazione in un'istruzione synchronized . L'acquisizione del blocco di monitoraggio di un'istanza Lock non ha alcuna relazione specificata con la #lock chiamata di uno dei metodi di tale istanza. È consigliabile evitare confusione che non usi Lock mai istanze in questo modo, tranne all'interno della propria implementazione.

Se non specificato, il passaggio di un null valore per qualsiasi parametro comporterà la generazione di un'eccezione NullPointerException .

<sincronizzazione< della memoria h2>/h2>

Tutte le implementazioni em must/em applicano la stessa semantica di sincronizzazione della memoria fornita dal blocco di monitoraggio predefinito, come descritto nel capitolo 17 di <cite The Java Language Specification/cite: ul li A successful operation has the same memory synchronization effects as a successful em Lock/em action.All Lock implementations <em>must</em> enforce the Java Language Specification</cite>>: <ul<>li>A successful lock memory synchronization effects as a successful <em>Lock</em> action. <li Un'operazione riuscita unlock ha gli stessi effetti di sincronizzazione della memoria di un'azione>< di sblocco</em riuscita>.> </ul>

Le operazioni di blocco e sblocco non riuscite e le operazioni di blocco/sblocco reentrant non richiedono alcun effetto di sincronizzazione della memoria.

<Considerazioni sull'implementazione< h2>/h2>

Le tre forme di acquisizione del blocco (interrompibili, non interrompibili e timed) possono variare in base alle caratteristiche delle prestazioni, alle garanzie di ordinamento o ad altre qualità di implementazione. Inoltre, la possibilità di interrompere l'acquisizione <in>corso</em> di un blocco potrebbe non essere disponibile in una determinata Lock classe. Di conseguenza, non è necessaria un'implementazione per definire esattamente le stesse garanzie o semantiche per tutte e tre le forme di acquisizione del blocco, né è necessario supportare l'interruzione di un'acquisizione di blocco in corso. È necessaria un'implementazione per documentare chiaramente la semantica e le garanzie fornite da ognuno dei metodi di blocco. Deve inoltre rispettare la semantica di interruzione definita in questa interfaccia, nella misura in cui è supportata l'interruzione dell'acquisizione del blocco: che è totalmente o solo sulla voce del metodo.

Poiché l'interruzione implica in genere l'annullamento e i controlli per l'interruzione sono spesso poco frequenti, un'implementazione può favorire la risposta a un interrupt rispetto alla restituzione normale del metodo. Ciò vale anche se può essere dimostrato che l'interruzione si è verificata dopo che un'altra azione potrebbe aver sbloccato il thread. Un'implementazione deve documentare questo comportamento.

Aggiunto nella versione 1.5.

Documentazione java per java.util.concurrent.locks.Lock.

Le parti di questa pagina sono modifiche basate sul lavoro creato e condiviso dal Android e usato in base ai termini descritti in 2.5 Attribution License Creative Commons 2.5 Attribution License.

Proprietà

Handle

Ottiene il valore JNI dell'oggetto Android sottostante.

(Ereditato da IJavaObject)
JniIdentityHashCode

Restituisce il valore di java.lang.System.identityHashCode() per l'istanza di di cui è stato eseguito il wrapping.

(Ereditato da IJavaPeerable)
JniManagedPeerState

Stato del peer gestito.

(Ereditato da IJavaPeerable)
JniPeerMembers

Supporto per l'accesso ai membri e la chiamata.

(Ereditato da IJavaPeerable)
PeerReference

Restituisce un JniObjectReference oggetto dell'istanza dell'oggetto Java di cui è stato eseguito il wrapping.

(Ereditato da IJavaPeerable)

Metodi

Disposed()

Chiamato quando l'istanza è stata eliminata.

(Ereditato da IJavaPeerable)
DisposeUnlessReferenced()

Se non sono presenti riferimenti in sospeso a questa istanza, chiama Dispose(); in caso contrario, non esegue alcuna operazione.

(Ereditato da IJavaPeerable)
Finalized()

Chiamato quando l'istanza è stata finalizzata.

(Ereditato da IJavaPeerable)
Lock()

Acquisisce il blocco.

LockInterruptibly()

Acquisisce il blocco a meno che il thread corrente non sia Thread#interrupt interrotto.

NewCondition()

Restituisce una nuova Condition istanza associata a questa Lock istanza.

SetJniIdentityHashCode(Int32)

Impostare il valore restituito da JniIdentityHashCode.

(Ereditato da IJavaPeerable)
SetJniManagedPeerState(JniManagedPeerStates)

Lock le implementazioni forniscono operazioni di blocco più estese di quanto sia possibile ottenere usando synchronized metodi e istruzioni.

(Ereditato da IJavaPeerable)
SetPeerReference(JniObjectReference)

Impostare il valore restituito da PeerReference.

(Ereditato da IJavaPeerable)
TryLock()

Acquisisce il blocco solo se è libero al momento della chiamata.

TryLock(Int64, TimeUnit)

Acquisisce il blocco se è libero entro il tempo di attesa specificato e il thread corrente non è stato interrotto thread#interrupt.

Unlock()

Rilascia il blocco.

UnregisterFromRuntime()

Annullare la registrazione di questa istanza in modo che il runtime non lo restituisca dalle chiamate future Java.Interop.JniRuntime+JniValueManager.PeekValue .

(Ereditato da IJavaPeerable)

Metodi di estensione

JavaCast<TResult>(IJavaObject)

Esegue una conversione del tipo verificato dal runtime Android.

JavaCast<TResult>(IJavaObject)

Lock le implementazioni forniscono operazioni di blocco più estese di quanto sia possibile ottenere usando synchronized metodi e istruzioni.

GetJniTypeName(IJavaPeerable)

Lock le implementazioni forniscono operazioni di blocco più estese di quanto sia possibile ottenere usando synchronized metodi e istruzioni.

Si applica a