În Java, folosim semaforul în sincronizarea firelor de execuție. Acesta este utilizat pentru a controla accesul la o resursă partajată care utilizează o variabilă de contor. Java oferă, de asemenea, o clasă Semaphore care conține constructori și diverse metode pentru a controla accesul la resursa partajată. O vom discuta mai târziu în această secțiune.

Înainte de a trece mai departe în această secțiune, mai întâi, vom înțelege ce este semaforul, tipurile de semafoare, cum funcționează și cum se implementează semaforul. După ce vom ști totul despre aceasta, vom trece la programele Java semafoare.

Ce este un semafor?

Un semafor este utilizat pentru a limita numărul de fire care doresc să acceseze o resursă partajată. Cu alte cuvinte, este o variabilă non-negativă care este partajată între firele de execuție, cunoscută sub numele de contor. Aceasta stabilește limita firelor de execuție. Un mecanism în care un fir de execuție așteaptă un semafor poate fi semnalat de alte fire de execuție.

  • Dacă contorul > 0, accesul la resursele partajate este oferit.
  • Dacă contorul = 0, accesul la resursele partajate este refuzat.

În concluzie, contorul ține evidența numărului de permisiuni pe care le-a acordat unei resurse partajate. Prin urmare, semaforul acordă permisiunea firelor de a partaja o resursă.

Caracteristicile unui semafor

Există următoarele caracteristici ale unui semafor:

  • Asigură sincronizarea între fire.
  • Diminuează nivelul de sincronizare. Prin urmare, oferă un mecanism de sincronizare de nivel scăzut.
  • Semaforul nu conține o valoare negativă. El deține o valoare care poate fi fie mai mare decât zero, fie egală cu zero.
  • Pot fi implementat semaforul folosind operația de testare și întreruperile, iar pentru execuție folosim descriptorii de fișiere.

Funcționarea semaforului

Semaforul controlează resursa partajată prin intermediul unei variabile de contor. Contorul este o valoare non-negativă. Acesta conține o valoare fie mai mare decât 0, fie egală cu 0.

  • Dacă contorul > 0, firul primește permisiunea de a accesa resursa partajată, iar valoarea contorului este decrementată cu 1.
  • În caz contrar, firul va fi blocat până când poate fi obținut un permis.
  • Când execuția firului este finalizată, atunci nu mai este nevoie de resursă și firul o eliberează. După eliberarea resursei, valoarea contorului crește cu 1.
  • Dacă un alt fir așteaptă să achiziționeze o resursă, firul va achiziționa un permis în acel moment.
  • Dacă contorul = 0, firul nu primește permisiunea de a accesa resursa partajată.

Să înțelegem funcționarea semaforului cu ajutorul unei diagrame de flux.

Java Semaphore

Tipuri de semafoare

Există patru tipuri de semafoare, care sunt următoarele:

  • Semafoare de numărare
  • Semafoare limitate
  • Semafoare temporizate
  • Semafoare binare

Semafoare Java

Să le discutăm pe rând în detaliu.

Semafoare de numărare

Semafoarele de numărare sunt folosite pentru a rezolva situația în care mai multe procese doresc să se execute în secțiunea critică, simultan. Prin urmare, pentru a depăși această problemă, folosim semafoare de numărare. De exemplu, luați în considerare următorul fragment de cod.

Să vedem implementarea semafoarelor de numărare.

CountingSemaphoresExample.java

Bounded Semaphores

Potem stabili limita superioară a limitei folosind semafoarele delimitate. Acesta este utilizat în locul semafoarelor de numărare, deoarece semafoarele de numărare nu conțin nicio valoare a limitei superioare. Valoarea limitei superioare denotă câte semnale poate stoca. De exemplu, luați în considerare următorul fragment de cod.

Să vedem implementarea semaforului delimitat.

BoundedSemaphoresExample.java

Semafoare temporizate

Semafoarele temporizate permit unui fir de execuție să funcționeze pentru o perioadă de timp specificată. După un anumit timp, temporizatorul se resetează și eliberează toate celelalte permise.

Să vedem implementarea semafoarelor temporizate.

TimedSemaphoresExample.java

Semafoare binare

Semafoarele binare sunt la fel ca și semafoarele de numărare. Dar nu uitați că acceptă doar valori binare, fie 0, fie 1. Implementarea sa este ușoară în comparație cu alți semafoare. Dacă valoarea este 1, operația de semnalare este un succes, eșuează în caz contrar.

Să vedem implementarea semafoarelor binare.

BinarySemaphoresExample.java

Semaphore in Java

În Java, este o construcție de sincronizare a firelor. Construcția utilizează o variabilă cunoscută sub numele de contor care controlează accesul asupra resursei partajate. Este un tip de variabilă care este utilizat pentru a gestiona procesele concurente și, de asemenea, pentru a le sincroniza. De asemenea, este utilizată pentru a evita condițiile de rasă. Restricționează numărul de fire care pot accesa o resursă partajată.

De exemplu, putem restricționa accesul la un fișier până la 10 conexiuni simultan.

Clasa Java Semaphore

Java oferă o clasă Semaphore pentru a implementa mecanismul de semaforizare. Aceasta aparține pachetului java.util.concurrent. Ea implementează interfața Serializable. Prin urmare, nu este necesară o implementare manuală.

Clasa Semaphore oferă următorii doi constructori:

  • Semaphore(int permits)
  • Semaphore(int permits, boolean fair)

Semaphore(int permits)

Creează un Semaphore și analizează numărul de permise (numărul inițial de permise disponibile) ca argument. Specifică numărul de fire care pot partaja o resursă la un moment dat. Valoarea numărului de permise poate fi negativă. În acest caz, trebuie să aibă loc o eliberare înainte de a se acorda orice achiziție.

Sintaxa:

Semaphore(int permits, boolean fair)

Creează un Semaphore cu numărul de permise dat și cu setările de corectitudine date.

Sintaxa:

Analizează doi parametri:

  • permits: Valoarea permiselor poate fi negativă. În acest caz, eliberarea trebuie să aibă loc înainte de a se acorda orice achiziție.
  • fair: Dacă setăm valoarea la true, semaforul garantează FIFO firelor în ordinea în care sunt solicitate, false În mod implicit, toate firele care așteaptă resursa acordă permise într-o ordine nedefinită.

Metode ale clasei Semaphore

Clasa oferă următoarele metode:

Metodaacquire(): Metoda achiziționează permisele de la semafor, blocându-se până când este disponibil unul sau până când firul este întrerupt. Aceasta reduce numărul de permise disponibile cu 1.

Dacă nu există nici un permis disponibil pentru firul curent, firul devine dezactivat în scopul programării firelor. Firul curent trece în stare inactivă până când se întâmplă unul dintre cele două lucruri:

  • Dacă celălalt fir invocă metoda release() pentru a elibera resursa, atunci firul curent primește permise.
  • Dacă celălalt fir întrerupe firul curent.

Se aruncă InterruptedException dacă firul curent este întrerupt. Metoda nu returnează nici o valoare.

Sintaxa:

Metodarelease(): Eliberează un permis și îl returnează la semafor. Incrementă numărul de permise disponibile cu 1. Dacă un fir de execuție încearcă să achiziționeze un permis, semaforul acordă permisiunea de a achiziționa resursa care tocmai a fost eliberată de alte fire de execuție. Mai mult, firul respectiv este luat în considerare în scopul programării firelor.

Sintaxa:

availablePermits() Metoda: Metoda returnează numărul de permise disponibile în semafor pentru acordarea resursei. De obicei, este utilizată în scopuri de depanare și testare.

Sintaxa:

Să înțelegem metodele de mai sus printr-un exemplu simplu.

Utilizarea semaforului ca blocare

Java ne permite să folosim un semafor ca blocare. Aceasta înseamnă că blochează accesul la resursă. Orice fir de execuție care dorește să acceseze resursa blocată, trebuie să apeleze metoda acquire() înainte de a accesa resursa pentru a dobândi blocarea. Firul trebuie să elibereze blocajul prin apelarea metodei release(), după terminarea sarcinii. Nu uitați că ați stabilit limita superioară la 1. De exemplu, luați în considerare următorul fragment de cod:

Să vedem un exemplu de semaforizare și să folosim semaforizarea ca blocare.

SemaphoreAsLock.java

Output:

Java Semaphore

Nota: Când executăm programul de mai sus, obținem o ieșire diferită de fiecare dată. Așadar, este posibil ca ieșirea dvs. să fie diferită de cea prezentată mai sus.

Java Semaphore Example

Să înțelegem mecanismul de semaforizare prin intermediul unui program Java. În exemplul următor, am creat un constructor al clasei Semaphore cu valoarea inițială a permisului 3.

SemaphoreExample.java

Succesiune:

Java Semaphore
.

Lasă un răspuns

Adresa ta de email nu va fi publicată.