Hvad er Semaphore i Java og dets anvendelse?



En semafor bruges til synkronisering af processer. Denne blog på vil guide dig gennem de forskellige typer og implementering af semaforer i java.

En semafor i styrer adgang til en delt ressource via en tæller. Det er en trådsynkronisering konstruktion bruges til at sende signaler mellem tråde for at undgå ubesvarede signaler eller beskytte et kritisk afsnit. I denne blog om Semaphores i Java vil vi forstå konceptet i detaljer.
Følgende emner vil blive dækket i denne blog:

Hvad er Semaphore i Java?

En semafor er en variabel, der bruges til synkronisering af processer, der bruges til styring af samtidige processer. Det bruges også til at kontrollere adgangen til en fælles ressource ved flere samtidige processer og undgå en løbetilstand.





Typer af semafor -

  • Binær semafor: En binær semafor tager kun 0 og 1 som værdier og bruges til at implementere gensidig udelukkelse samt synkronisere samtidige processer.

  • Tæller semafor: Værdien af ​​en tællesemafor til enhver tid angiver det maksimale antal processer, der kan komme ind i det kritiske afsnit på nøjagtig samme tid.



Arbejde af Semaphore

  • Hvis semafor tæller> 0, får tråden en tilladelse, der reducerer semaforens optælling.

  • Ellers den er blokeret, indtil en tilladelse kan erhverves.

  • Når tråd ikke længere har brug for adgang til en delt ressource, frigiver den tilladelsen og øger semafortællingen.



  • Hvis en anden tråd venter på en tilladelse, får den tråd en tilladelse på det tidspunkt.

Implementering af Semaphore

import java.util.concurrent. * // Tager Ressource som delt klasseklasse Ressource {statisk intantal = 0} klasse MyDemo udvider demo {Semaphore sem String threadName offentlig MyDemo (Semaphore sem, String threadName) {super (threadName) dette. sem = sem this.threadName = threadName} @ Override public void run () {// Kør af X hvis (this.getName (). er lig med ('X')) {System.out.println ('Starter' + threadName) prøv {// Vil få tilladelse til at få adgang til delt ressource System.out.println (threadName + 'venter på en tilladelse.') // erhvervelse af låsen sem.acquire () System.out.println (threadName + 'får en tilladelse . ') // Nu vil adgang til den delte ressource og hvile vente på (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) } } 

Produktion-
Start X
Start Y
X venter på tilladelse
Du venter på tilladelse
X: 1
X: 2
X: 3
X: 4
X: 5
X: 6
X: 7
X frigiver tilladelsen
Y får tilladelsen
Y: 6
Y: 5
Y: 4
Y: 3
Y: 2
Y: 1
Y: 0
Og frigiver tilladelse
tælle: 0

Med dette kommer vi til slutningen af ​​denne blog om “Semaforer i Java”. Hvis du ønsker at lære mere om Java, skal du tjekke af Edureka, et pålideligt online læringsfirma med et netværk på mere end 250.000 tilfredse elever spredt over hele kloden. Edurekas Java J2EE- og SOA-uddannelses- og certificeringskursus er designet til studerende og fagfolk, der ønsker at være Java-udvikler. Kurset er designet til at give dig et forspring i Java-programmering og træne dig til både kerne- og avancerede Java-koncepter sammen med forskellige Java-rammer som Hibernate & Spring.

sorteringsliste c ++

Har du et spørgsmål til os? Nævn det i kommentarfeltet i denne “Hvad er Semaphore i Java” -blog, og vi vender tilbage til dig hurtigst muligt.