Wat is Semaphore in Java en het gebruik ervan?



Een semafoor wordt gebruikt voor het synchroniseren van processen. Deze blog zal je door de verschillende soorten en implementatie van semaforen in Java leiden.

Een semafoor in beheert de toegang tot een gedeelde bron via een teller. Het is een thread synchronisatie construct dat wordt gebruikt om signalen tussen threads te verzenden om gemiste signalen te vermijden of om een ​​kritieke sectie te bewaken. In deze blog over Semaphores in Java zullen we het concept tot in detail begrijpen.
In deze blog komen de volgende onderwerpen aan bod:

Wat is Semaphore in Java?

Een semafoor is een variabele die wordt gebruikt voor de synchronisatie van processen die wordt gebruikt voor het beheren van gelijktijdige processen. Het wordt ook gebruikt om de toegang tot een gemeenschappelijke bron te regelen door meerdere gelijktijdige processen en om een ​​race-conditie te voorkomen.





Soorten semafoor -

  • Binaire semafoor: Een binaire semafoor heeft slechts 0 en 1 als waarden en wordt gebruikt om wederzijdse uitsluiting te implementeren en gelijktijdige processen te synchroniseren.

  • Semafoor tellen: De waarde van een tellende semafoor op een willekeurig punt geeft het maximale aantal processen aan dat op exact hetzelfde moment de kritieke sectie kan binnengaan.



Werking van Semaphore

  • Als de semafoortelling> 0 is, krijgt de thread een vergunning, waardoor de telling van de semafoor afneemt.

  • Anders, de wordt geblokkeerd totdat een vergunning kan worden verkregen.

  • Wanneer de thread geen toegang meer nodig heeft tot een gedeelde bron, geeft het de vergunning vrij, waarbij het aantal semaforen wordt verhoogd.



    c ++ wat is een naamruimte
  • Wacht een andere thread op een vergunning, dan krijgt die thread op dat moment een vergunning.

Implementatie van Semaphore

import java.util.concurrent. * // Zal Resource nemen als gedeelde class class Resource {static int count = 0} class MyDemo breidt Demo {Semaphore sem String threadName openbaar MyDemo (Semaphore sem, String threadName) {super (threadName) dit uit. sem = sem this.threadName = threadName} @Override public void run () {// Uitgevoerd door X if (this.getName (). equals ('X')) {System.out.println ('Starting' + threadName) probeer {// Krijgt de vergunning om toegang te krijgen tot de gedeelde bron System.out.println (threadName + 'wacht op een vergunning.') // verkrijg het slot sem.acquire () System.out.println (threadName + 'krijgt een vergunning . ') // Nu, toegang tot de gedeelde bron en rust zal wachten op (int i = 0 i<7 i++) { Resource.count++ System.out.println(threadName + ': ' + Resouce.count) // Now thread Y will try to execute Thread.sleep(20) } } catch (InterruptedException exc) { System.out.println(exc) } // Release the permit. System.out.println(threadName + ' releases the permit.') sem.release() } // run by thread Y else { System.out.println('Starting ' + threadName) try { // First, Y will try to get permit System.out.println(threadName + ' waiting for a permit.') // acquiring the lock sem.acquire() System.out.println(threadName + ' gets a permit.') // Now, accessing the shared resource and others will wait for(int i=0 i < 7 i++) { Resource.count-- System.out.println(threadName + ': ' + Resource.count) // Now, allowing a context switch -- if possible. // for thread X to execute Thread.sleep(20) } } catch (InterruptedException exc) { System.out.println(exc) } // Release the permit. System.out.println(threadName + ' releases the permit.') sem.release() } } } public class SemTest { public static void main(String args[]) throws InterruptedException { // creating a Semaphore object // with number of permits 1 Semaphore sem = new Semaphore(1) // creating two threads with name X and Y // Here thread X will increment and Y will decrement the counter MyDemo md1 = new MyDemo(sem, 'X') MyDemo md2 = new MyDemo(sem, 'Y') // stating threads X and Y md1.start() md2.start() // waiting for threads X and Y md1.join() mtd.join() System.out.println('count: ' + Resource.count) } } 

Uitgang
Vanaf X
Vanaf Y
X wacht op een vergunning
Y wacht op een vergunning
X: 1
X: 2
X: 3
X: 4
X: 5
X: 6
X: 7
X geeft de vergunning vrij
Y krijgt de vergunning
Y: 6
J: 5
Y: 4
J: 3
J: 2
J: 1
Y: 0
En releases vergunning
aantal: 0

Hiermee komen we aan het einde van deze blog over “Semaphores in Java”. Als je meer wilt weten over Java, bekijk dan het door Edureka, een vertrouwd online leerbedrijf met een netwerk van meer dan 250.000 tevreden leerlingen verspreid over de hele wereld. De training- en certificeringcursus Java J2EE en SOA van Edureka is bedoeld voor studenten en professionals die Java-ontwikkelaar willen worden. De cursus is bedoeld om u een voorsprong te geven in het programmeren van Java en u te trainen in zowel kern- als geavanceerde Java-concepten, samen met verschillende Java-frameworks zoals Hibernate & Spring.

Heeft u een vraag voor ons? Vermeld het alstublieft in de commentarensectie van deze “Wat is Semaphore in Java” blog en we nemen zo snel mogelijk contact met u op.