Che cos'è Java Semaphore e Mutex – Java Concurrency MultiThread spiegato con l'esempio

Pubblicato: 2015-03-12

Tutorial Java Mutex e Semaphore di Crunchify

La concorrenza Java è un argomento molto ampio. Ci sono centinaia di tutorial ed esempi disponibili per l'uso. Qualche tempo fa ho scritto alcuni tutorial su Esegui più thread contemporaneamente in Java e diversi tipi di blocchi sincronizzati.

In questo tutorial andremo oltre:

  1. Spiegazione di Mutex
  2. Spiegazione del semaforo
  3. Due esempi con dettagli

Iniziamo

Let's keep this in mind mentre leggiamo la spiegazione di seguito:

  • Prendi un esempio di Acquirente e Cliente
  • L'acquirente prende in prestito dei laptop
  • Il cliente può venire e utilizzare il laptop: il cliente ha bisogno di una chiave per utilizzare un laptop
  • Dopo l'uso: il cliente può restituire il laptop all'acquirente

Che cos'è Mutex (solo 1 thread):

L'acquirente ha una chiave per un laptop. Un cliente può avere la chiave - prendere in prestito un laptop - alla volta. Al termine dell'attività, l'Acquirente consegna (libera) la chiave al prossimo cliente in coda.

Official Definition :

“Mutex viene in genere utilizzato per serializzare l'accesso a una sezione di re-entrant code che cannot be executed concurrently da più di un thread. Un oggetto mutex consente a un solo thread di entrare in una sezione controllata, costringendo gli altri thread che tentano di accedere a quella sezione ad attendere che il primo thread sia uscito da quella sezione.

In altre parole: Mutex = Mutually Exclusive Semaphore

Che cos'è il semaforo (N thread specificati):

Diciamo che ora Shopper ha 3 laptop identici e 3 tasti identici. Il semaforo è il numero di free identical Laptop keys . Il conteggio del semaforo - il conteggio delle chiavi - è impostato su 3 all'inizio (tutti e tre i laptop sono liberi), quindi il valore del conteggio viene decrementato quando i clienti stanno entrando. Se tutti i laptop sono in uso, ovvero non ci sono chiavi libere per Laptop, il conteggio del semaforo è 0. Ora, quando uno dei clienti restituisce il laptop, il semaforo viene aumentato a 1 (una chiave gratuita) e assegnato al cliente successivo nella coda.

Official Definition : “Un semaforo limita il numero di utenti simultanei di una risorsa condivisa fino a un numero massimo. I thread possono richiedere l'accesso alla risorsa (diminuendo il semaforo) e possono segnalare che hanno terminato di utilizzare la risorsa (incrementando il semaforo)."

Un altro deve leggere: Creazione pigra di istanza ThreadSafe Singleton

Esempio-1: (spiegazione di seguito)

Nel tutorial sopra CrunchifySemaphoreMutexTutorial.java quando CrunchifyProducer aggiunge threadName all'oggetto crunchifyList linkedList può segnalare il semaforo.

Il CrunchifyConsumer può quindi provare ad acquisire il semaforo in modo che aspetteranno fino a quando CrunchifyProducer non avrà segnalato che è stato aggiunto un threadID. Dopo aver segnalato un dato aggiunto, uno dei consumatori verrà svegliato e saprà di poter leggere un oggetto crunchifyList. Può leggere un elenco, quindi tornare a provare ad acquisire sul semaforo.

Se in quel tempo il produttore ha scritto un altro pacchetto, ha segnalato di nuovo e uno dei consumatori andrà quindi a leggere un altro pacchetto e così via...

In altre parole:

Risultato:

Come prevenire la condizione di razza:

What if you have multiple Consumers? Tutorial Java sopra I consumatori (non il produttore) dovrebbero bloccare il buffer durante la lettura del pacchetto (ma non durante l'acquisizione del semaforo) per evitare condizioni di gara. Nell'esempio seguente il produttore blocca anche l'elenco poiché tutto è sulla stessa JVM.

Esempio-2:

Risultato: