Semaphore Classe

Definizione

Semaforo di conteggio.

[Android.Runtime.Register("java/util/concurrent/Semaphore", DoNotGenerateAcw=true)]
public class Semaphore : Java.Lang.Object, IDisposable, Java.Interop.IJavaPeerable, Java.IO.ISerializable
[<Android.Runtime.Register("java/util/concurrent/Semaphore", DoNotGenerateAcw=true)>]
type Semaphore = class
    inherit Object
    interface ISerializable
    interface IJavaObject
    interface IDisposable
    interface IJavaPeerable
Ereditarietà
Semaphore
Attributi
Implementazioni

Commenti

Semaforo di conteggio. Concettualmente, un semaforo mantiene un set di permessi. Ogni #acquire blocco, se necessario, fino a quando non è disponibile un permesso e quindi lo accetta. Ogni #release aggiunge un permesso, potenzialmente rilasciando un acquisitore di blocco. Tuttavia, non vengono utilizzati oggetti consentiti effettivi; il Semaphore solo mantiene un conteggio del numero disponibile e agisce di conseguenza.

I semafori vengono spesso usati per limitare il numero di thread che possono accedere a una risorsa (fisica o logica). Ecco ad esempio una classe che usa un semaforo per controllare l'accesso a un pool di elementi:

{@code
            class Pool {
              private static final int MAX_AVAILABLE = 100;
              private final Semaphore available = new Semaphore(MAX_AVAILABLE, true);

              public Object getItem() throws InterruptedException {
                available.acquire();
                return getNextAvailableItem();
              }

              public void putItem(Object x) {
                if (markAsUnused(x))
                  available.release();
              }

              // Not a particularly efficient data structure; just for demo

              protected Object[] items = ...; // whatever kinds of items being managed
              protected boolean[] used = new boolean[MAX_AVAILABLE];

              protected synchronized Object getNextAvailableItem() {
                for (int i = 0; i < MAX_AVAILABLE; ++i) {
                  if (!used[i]) {
                    used[i] = true;
                    return items[i];
                  }
                }
                return null; // not reached
              }

              protected synchronized boolean markAsUnused(Object item) {
                for (int i = 0; i < MAX_AVAILABLE; ++i) {
                  if (item == items[i]) {
                    if (used[i]) {
                      used[i] = false;
                      return true;
                    } else
                      return false;
                  }
                }
                return false;
              }
            }}

Prima di ottenere un elemento ogni thread deve acquisire un permesso dal semaforo, garantendo che un elemento sia disponibile per l'uso. Al termine del thread con l'elemento restituito al pool e viene restituito un permesso al semaforo, consentendo a un altro thread di acquisire tale elemento. Si noti che non viene mantenuto alcun blocco di sincronizzazione quando #acquire viene chiamato come in questo modo si impedisce che un elemento venga restituito al pool. Il semaforo incapsula la sincronizzazione necessaria per limitare l'accesso al pool, separatamente da qualsiasi sincronizzazione necessaria per mantenere la coerenza del pool stesso.

Un semaforo inizializzato in uno, che viene usato in modo che abbia al massimo un permesso disponibile, può fungere da blocco di esclusione reciproca. Questo è più comunemente noto come <semaforo<> binario em>, perché ha solo due stati: uno permesso disponibile o zero permesso disponibile. Se usato in questo modo, il semaforo binario ha la proprietà (a differenza di molte java.util.concurrent.locks.Lock implementazioni), che il " blocco " può essere rilasciato da un thread diverso dal proprietario (come semafori non hanno alcuna nozione di proprietà). Ciò può essere utile in alcuni contesti specializzati, ad esempio il ripristino del deadlock.

Il costruttore per questa classe accetta facoltativamente un <parametro em>fairness</em> . Se impostata su false, questa classe non garantisce l'ordine in cui i thread acquisiscono i permessi. In particolare, <em>barging</em> è consentito, ovvero un thread che richiama #acquire può essere allocato un permesso prima di un thread in attesa, logicamente il nuovo thread si posiziona all'inizio della coda di thread in attesa. Quando l'equità è impostata su true, il semaforo garantisce che i thread che richiamano uno dei #acquire() acquire metodi siano selezionati per ottenere i permessi nell'ordine in cui è stata elaborata la loro chiamata di tali metodi (first-in-first-out; FIFO). Si noti che l'ordinamento FIFO si applica necessariamente a specifici punti interni di esecuzione all'interno di questi metodi. Pertanto, è possibile che un thread richiami acquire prima di un altro, ma raggiunga il punto di ordinamento dopo l'altro e analogamente al ritorno dal metodo . Si noti anche che i metodi non previsti #tryAcquire() tryAcquire non rispettano l'impostazione di equità, ma accettano eventuali permessi disponibili.

In genere, i semafori usati per controllare l'accesso alle risorse devono essere inizializzati come equi, per garantire che nessun thread non sia bloccato dall'accesso a una risorsa. Quando si usano semafori per altri tipi di controllo della sincronizzazione, i vantaggi della velocità effettiva dell'ordinamento non equo spesso superano le considerazioni di equità.

Questa classe fornisce anche metodi pratici a #acquire(int) acquire e #release(int) release più autorizzazioni per volta. Questi metodi sono in genere più efficienti ed efficaci rispetto ai cicli. Tuttavia, non stabiliscono alcun ordine di preferenza. Ad esempio, se il thread A richiama ) e il thread B richiama s.acquire(3s.acquire(2)e due permessi diventano disponibili, non c'è alcuna garanzia che il thread B li otterrà a meno che l'acquisizione non sia arrivata per prima e Semaphore s sia in modalità equa.

Effetti di coerenza della memoria: azioni in un thread prima di chiamare un metodo "release", ad esempio release()<le>azioni prima</i> che seguono un metodo di "acquisizione" riuscito, acquire() ad esempio in un altro thread.

Aggiunto nella versione 1.5.

per java.util.concurrent.Semaphore.

Le parti di questa pagina sono modifiche basate sul lavoro creato e condiviso dalla e usati in base ai termini descritti in Creative License 2.5 Attribution License.

Costruttori

Nome Descrizione
Semaphore(Int32, Boolean)

Crea un Semaphore oggetto con il numero specificato di permessi e l'impostazione di equità specificata.

Semaphore(Int32)

Crea un Semaphore oggetto con il numero specificato di autorizzazioni e l'impostazione di equità non fairness.

Semaphore(IntPtr, JniHandleOwnership)

Costruttore usato durante la creazione di rappresentazioni gestite di oggetti JNI; chiamato dal runtime.

Proprietà

Nome Descrizione
Class

Restituisce la classe di runtime di questo Objectoggetto .

(Ereditato da Object)
Handle

Handle per l'istanza di Android sottostante.

(Ereditato da Object)
HasQueuedThreads

Esegue una query che indica se i thread sono in attesa di acquisizione.

IsFair

Restituisce true se il semaforo ha l'equità impostata su true.

JniIdentityHashCode

Semaforo di conteggio.

(Ereditato da Object)
JniPeerMembers

Semaforo di conteggio.

PeerReference

Semaforo di conteggio.

(Ereditato da Object)
QueuedThreads

Restituisce un insieme contenente thread in attesa di acquisizione.

QueueLength

Restituisce una stima del numero di thread in attesa di acquisizione.

ThresholdClass

Questa API supporta l'infrastruttura Mono per Android e non deve essere usata direttamente dal codice.

ThresholdType

Questa API supporta l'infrastruttura Mono per Android e non deve essere usata direttamente dal codice.

Metodi

Nome Descrizione
Acquire()

Acquisisce un permesso da questo semaforo, bloccando fino a quando non ne è disponibile uno o il thread è Thread#interrupt interrotto.

Acquire(Int32)

Acquisisce il numero specificato di permessi da questo semaforo, bloccando fino a quando non sono disponibili tutti o il thread è Thread#interrupt interrotto.

AcquireUninterruptibly()

Acquisisce un permesso da questo semaforo, bloccando fino a quando non ne è disponibile uno.

AcquireUninterruptibly(Int32)

Acquisisce il numero specificato di permessi da questo semaforo, bloccando fino a quando non sono disponibili tutti.

AvailablePermits()

Restituisce il numero corrente di permessi disponibili in questo semaforo.

Clone()

Crea e restituisce una copia di questo oggetto.

(Ereditato da Object)
Dispose()

Semaforo di conteggio.

(Ereditato da Object)
Dispose(Boolean)

Semaforo di conteggio.

(Ereditato da Object)
DrainPermits()

Acquisisce e restituisce tutti i permessi immediatamente disponibili o, se sono disponibili permessi negativi, li rilascia.

Equals(Object)

Indica se un altro oggetto è "uguale a" questo.

(Ereditato da Object)
GetHashCode()

Restituisce un valore del codice hash per l'oggetto.

(Ereditato da Object)
JavaFinalize()

Chiamato dal Garbage Collector su un oggetto quando Garbage Collection determina che non sono presenti altri riferimenti all'oggetto .

(Ereditato da Object)
Notify()

Riattiva un singolo thread in attesa del monitor dell'oggetto.

(Ereditato da Object)
NotifyAll()

Riattiva tutti i thread in attesa del monitor dell'oggetto.

(Ereditato da Object)
ReducePermits(Int32)

Riduce il numero di permessi disponibili in base alla riduzione indicata.

Release()

Rilascia un permesso, restituendolo al semaforo.

Release(Int32)

Rilascia il numero specificato di permessi, restituendoli al semaforo.

SetHandle(IntPtr, JniHandleOwnership)

Imposta la proprietà Handle.

(Ereditato da Object)
ToArray<T>()

Semaforo di conteggio.

(Ereditato da Object)
ToString()

Restituisce una rappresentazione di stringa dell'oggetto.

(Ereditato da Object)
TryAcquire()

Acquisisce un permesso da questo semaforo, solo se ne è disponibile uno al momento della chiamata.

TryAcquire(Int32, Int64, TimeUnit)

Acquisisce il numero specificato di permessi da questo semaforo, se tutti diventano disponibili entro il tempo di attesa specificato e il thread corrente non è stato interrotto da Thread#interrupt.

TryAcquire(Int32)

Acquisisce il numero specificato di permessi da questo semaforo, solo se tutti sono disponibili al momento della chiamata.

TryAcquire(Int64, TimeUnit)

Acquisisce un permesso da questo semaforo, se uno diventa disponibile entro il tempo di attesa specificato e il thread corrente non è stato interrotto Thread#interrupt.

UnregisterFromRuntime()

Semaforo di conteggio.

(Ereditato da Object)
Wait()

Fa sì che il thread corrente attenda finché non viene risvegliato, in genere ricevendo <>una notifica</em> o <em>interrotto</em>.

(Ereditato da Object)
Wait(Int64, Int32)

Fa sì che il thread corrente attenda finché non viene risvegliato, in genere ricevendo<> una notifica</em> o <em>interrotto</em> o fino a quando non è trascorsa una determinata quantità di tempo reale.

(Ereditato da Object)
Wait(Int64)

Fa sì che il thread corrente attenda finché non viene risvegliato, in genere ricevendo<> una notifica</em> o <em>interrotto</em> o fino a quando non è trascorsa una determinata quantità di tempo reale.

(Ereditato da Object)

Implementazioni dell'interfaccia esplicita

Nome Descrizione
IJavaPeerable.Disposed()

Semaforo di conteggio.

(Ereditato da Object)
IJavaPeerable.DisposeUnlessReferenced()

Semaforo di conteggio.

(Ereditato da Object)
IJavaPeerable.Finalized()

Semaforo di conteggio.

(Ereditato da Object)
IJavaPeerable.JniManagedPeerState

Semaforo di conteggio.

(Ereditato da Object)
IJavaPeerable.SetJniIdentityHashCode(Int32)

Semaforo di conteggio.

(Ereditato da Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

Semaforo di conteggio.

(Ereditato da Object)
IJavaPeerable.SetPeerReference(JniObjectReference)

Semaforo di conteggio.

(Ereditato da Object)

Metodi di estensione

Nome Descrizione
GetJniTypeName(IJavaPeerable)

Ottiene il nome JNI del tipo dell'istanza selfdi .

JavaAs<TResult>(IJavaPeerable)

Provare a digitare selfTResult, verificando che la coercizione sia valida sul lato Java.

JavaCast<TResult>(IJavaObject)

Esegue una conversione del tipo di tipo controllato dal runtime Android.

JavaCast<TResult>(IJavaObject)

Semaforo di conteggio.

TryJavaCast<TResult>(IJavaPeerable, TResult)

Provare a digitare selfTResult, verificando che la coercizione sia valida sul lato Java.

Si applica a