Kaj je Semaphore v Javi in ​​njegova uporaba?



Za sinhronizacijo procesov se uporablja semafor. Ta spletni dnevnik vas bo vodil skozi različne vrste in izvajanje semaforjev v javi.

Semafor v nadzoruje dostop do virov v skupni rabi prek števca. Je sinhronizacija niti konstrukcija, ki se uporablja za pošiljanje signalov med nitmi, da bi se izognili zgrešenim signalom ali zaščitili kritični del V tem blogu o Semaforjih v Javi bomo koncept podrobno razumeli.
V tem blogu bodo obravnavane naslednje teme:

Kaj je Semaphore v Javi?

Semafor je spremenljivka, ki se uporablja za sinhronizacijo procesov in se uporablja za upravljanje sočasnih procesov. Uporablja se tudi za nadzor dostopa do skupnega vira z več sočasnimi procesi in izogibanje dirkalnim pogojem.





Vrste semaforja -

  • Binarni semafor: Binarni semafor kot vrednosti vzame le 0 in 1 in se uporablja za izvajanje medsebojne izključitve in sinhronizacijo sočasnih procesov.

  • Štetje semaforja: Vrednost štetja semaforja na kateri koli točki označuje največje število procesov, ki lahko vstopijo v kritični odsek hkrati.



Delovanje Semaphora

  • Če je število semaforjev> 0, nit pridobi dovoljenje in zmanjša število semaforja.

  • V nasprotnem primeru je blokirana, dokler ni mogoče pridobiti dovoljenja.

    spajanje razvrščanje c ++ izvedba
  • Ko nit ne potrebuje več dostopa do vira v skupni rabi, sprosti dovoljenje in poveča število semaforjev.



  • Če druga nit čaka na dovoljenje, bo ta nit takrat pridobila dovoljenje.

Izvajanje Semaphore

import java.util.concurrent. * // Vir bo vzel kot razred predanega razreda Resource {static int count = 0} class MyDemo razširja Demo {Semaphore sem String threadName public MyDemo (Semaphore sem, String threadName) {super (threadName) this. sem = sem this.threadName = threadName} @Override public void run () {// Zaženi z X, če (this.getName (). je enako ('X')) {System.out.println ('Starting' + threadName) poskusite {// bo dobil dovoljenje za dostop do skupnega vira System.out.println (threadName + 'čakanje na dovoljenje.') // pridobitev ključavnice sem.acquire () System.out.println (threadName + ') dobi dovoljenje . ') // Zdaj bo dostop do vira v skupni rabi in počitek čakal (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) } } 

Izhod-
Zagon X
Zagon Y
X čaka na dovoljenje
Čakam na dovoljenje
X: 1
X: 2
X: 3
X: 4
X: 5
X: 6
X: 7
X sprosti dovoljenje
Y dobi dovoljenje
Y: 6
Y: 5
Y: 4
Y: 3
Y: 2
Y: 1
Y: 0
In dovoljenja za izdajo
štetje: 0

S tem smo prišli do konca tega spletnega dnevnika o 'Semaforjih v Javi'. Če želite izvedeti več o Javi, si oglejte Edureka, zaupanja vredno podjetje za spletno učenje z mrežo več kot 250.000 zadovoljnih učencev, ki se širijo po vsem svetu. Edurekin tečaj za usposabljanje in certificiranje Java J2EE in SOA je namenjen študentom in strokovnjakom, ki želijo biti razvijalec Java. Tečaj je zasnovan tako, da vam omogoči uvod v programiranje Java in vas usposobi za osnovne in napredne koncepte Java, skupaj z različnimi Java okviri, kot so Hibernate & Spring.

Imate vprašanje za nas? Prosimo, omenite ga v oddelku za komentarje tega bloga 'Kaj je Semaphore v Javi', in takoj, ko bo mogoče, se bomo oglasili.