Hva er Semaphore i Java og dets bruk?



En semafor brukes til synkronisering av prosesser. Denne bloggen på vil lede deg gjennom de forskjellige typene og implementeringen av semaforer i java.

En semafor i kontrollerer tilgang til en delt ressurs gjennom en teller. Det er en trådsynkronisering konstruksjon som brukes til å sende signaler mellom tråder for å unngå tapte signaler eller beskytte en kritisk seksjon. I denne bloggen om Semaphores i Java vil vi forstå konseptet i detalj.
Følgende emner vil bli dekket i denne bloggen:

Hva er Semaphore i Java?

En semafor er en variabel som brukes til synkronisering av prosesser som brukes til å håndtere samtidige prosesser. Den brukes også til å kontrollere tilgangen til en felles ressurs ved flere samtidige prosesser og unngå løpstilstand.





Typer semafor -

  • Binær semafor: En binær semafor tar bare 0 og 1 som verdier og brukes til å implementere gjensidig utestenging samt synkronisere samtidige prosesser.

  • Teller semafor: Verdien av en tellende semafor til enhver tid indikerer det maksimale antall prosesser som kan komme inn i den kritiske delen på nøyaktig samme tid.



Arbeid av Semaphore

  • Hvis semafor teller> 0, får tråden en tillatelse og reduserer semaforens teller.

    hvordan å avslutte programmet java
  • Ellers, den er sperret til en tillatelse kan anskaffes.

    java streng delt regex flere avgrensere
  • Når tråden ikke lenger trenger tilgang til en delt ressurs, frigjør den tillatelsen og øker semafortellingen.



  • Hvis en annen tråd venter på tillatelse, vil den tråden skaffe seg tillatelse på det tidspunktet.

Implementering av Semaphore

importere java.util.concurrent. * // Tar ressurs som delt klasseklasse Ressurs {static int count = 0} klasse MyDemo utvider Demo {Semaphore sem String threadName public MyDemo (Semaphore sem, String threadName) {super (threadName) dette. sem = sem this.threadName = threadName} @ Override public void run () {// Kjør av X hvis (this.getName (). tilsvarer ('X')) {System.out.println ('Starter' + trådnavn) prøv {// Får tillatelse til å få tilgang til delt ressurs System.out.println (threadName + 'venter på tillatelse.') // anskaffelse av låsen sem.acquire () System.out.println (threadName + 'får tillatelse . ') // Nå vil tilgang til den delte ressursen og resten 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) } } 

Produksjon-
Starter X
Starter Y
X venter på tillatelse
Du venter på tillatelse
X: 1
X: 2
X: 3
X: 4
X: 5
X: 6
X: 7
X frigjør tillatelsen
Y får tillatelsen
Y: 6
Y: 5
Y: 4
Y: 3
Y: 2
Y: 1
Y: 0
Og frigjør tillatelse
telle: 0

Med dette kommer vi til en slutt på denne bloggen om “Semaforer i Java”. Hvis du ønsker å lære mer om Java, kan du sjekke ut av Edureka, et pålitelig online læringsfirma med et nettverk med mer enn 250 000 fornøyde elever spredt over hele verden. Edurekas Java J2EE- og SOA-opplæring og sertifiseringskurs er designet for studenter og fagpersoner som ønsker å være Java-utvikler. Kurset er designet for å gi deg et forsprang i Java-programmering og trene deg for både kjerne- og avanserte Java-konsepter sammen med forskjellige Java-rammer som Hibernate & Spring.

Har du spørsmål til oss? Vennligst nevn det i kommentarfeltet i denne 'Hva er Semaphore i Java' -bloggen, så kommer vi tilbake til deg så snart som mulig.