Ce este Java Semaphore și Mutex – Java Concurrency MultiThread explicat cu Exemplu

Publicat: 2015-03-12

Tutorial Java Mutex și Semaphore de Crunchify

Java Concurrency este un subiect foarte larg. Există sute de tutoriale și exemple disponibile pentru utilizare. Cu ceva timp în urmă, am scris câteva tutoriale despre Run Multiple Threads simultan în Java și diferite tipuri de blocuri sincronizate.

În acest tutorial vom trece peste:

  1. Explicația Mutex
  2. Explicația Semaforului
  3. Două exemple cu detalii

Să începem

Let's keep this in mind timp ce citim explicația de mai jos:

  • Luați un exemplu de cumpărător și client
  • Cumpărătorul împrumută laptopuri
  • Clientul poate veni și utiliza laptopul – clientul are nevoie de o cheie pentru a utiliza un laptop
  • După utilizare – clientul poate returna laptopul la Cumpărător

Ce este Mutex (doar 1 fir):

Cumpărătorul are cheia unui laptop. Un client poate avea cheia – să împrumute un laptop – la momentul respectiv. Când sarcina se termină, Cumpărătorul dă (eliberează) cheia următorului client din coadă.

Official Definition :

„Mutex este folosit în mod obișnuit pentru a serializa accesul la o secțiune a re-entrant code care cannot be executed concurrently de mai mult de un fir. Un obiect mutex permite doar un fir într-o secțiune controlată, forțând alte fire care încearcă să obțină acces la acea secțiune să aștepte până când primul fir a ieșit din acea secțiune.”

Cu alte cuvinte: Mutex = Mutually Exclusive Semaphore

Ce este Semaphore (N fire specificate):

Să presupunem că acum Shopper are 3 laptopuri identice și 3 chei identice. Semaforul este numărul de free identical Laptop keys . Numărul de semafor – numărul de chei – este setat la 3 la început (toate cele trei laptopuri sunt gratuite), apoi valoarea numărului este diminuată pe măsură ce clientul intră. Dacă toate laptopurile sunt în uz, adică nu mai sunt chei libere pentru Laptop, numărul de semafor este 0. Acum, când oricare dintre clienți returnează laptopul, semaforul este mărit la 1 (o cheie gratuită) și dat următorului client din coadă.

Official Definition : „Un semafor restricționează numărul de utilizatori simultani ai unei resurse partajate până la un număr maxim. Threadurile pot solicita acces la resursă (decrementând semaforul) și pot semnala că au terminat de utilizat resursa (incrementând semaforul).”

Un alt trebuie citit: Lazy Creation of Singleton ThreadSafe Instance

Exemplul-1: (explicația de mai jos)

În tutorialul de mai sus CrunchifySemaphoreMutexTutorial.java , când CrunchifyProducer adaugă threadName la obiectul crunchifyList linkedList, poate semnala semaforul.

CrunchifyConsumer poate încerca apoi să achiziționeze semaforul, așa că va aștepta până când CrunchifyProducer a semnalat că a fost adăugat un threadID. La semnalarea unei date adăugate, unul dintre consumatori va fi trezit și va ști că poate citi un obiect crunchifyList. Poate citi o listă, apoi se întoarce la încercarea de a obține pe semafor.

Dacă în acel timp producătorul a scris un alt pachet, a semnalat din nou și oricare dintre consumatori va continua să citească un alt pachet și așa mai departe...

Cu alte cuvinte:

Rezultat:

Cum să preveniți starea de cursă:

What if you have multiple Consumers? În tutorialul Java de mai sus Consumatorii (nu producătorul) ar trebui să blocheze tamponul atunci când citesc pachetul (dar nu când achiziționează semaforul) pentru a preveni condițiile de cursă. În exemplul de mai jos, producătorul blochează și lista, deoarece totul este pe același JVM.

Exemplul-2:

Rezultat: