Què és el semafor a Java i el seu ús?



S'utilitza un semàfor per a la sincronització de processos. Aquest bloc us guiarà a través dels diferents tipus i implementació de semàfors a Java.

Un semàfor a controla l'accés a un recurs compartit mitjançant un comptador. És un sincronització de fils construcció que s’utilitza per enviar senyals entre fils per evitar senyals perduts o protegir una secció crítica. En aquest bloc sobre semàfors a Java, entendrem el concepte amb detall.
En aquest bloc es tractaran els temes següents:

Què és el semafor a Java?

Un semàfor és una variable que s’utilitza per a la sincronització de processos que s’utilitza per gestionar processos concurrents. També s'utilitza per controlar l'accés a un recurs comú mitjançant diversos processos concurrents i evitar una condició de carrera.





Tipus de semàfor -

  • Semàfor binari: Un semàfor binari només pren 0 i 1 com a valors i s’utilitza per implementar exclusió mútua i sincronitzar processos concurrents.

    anar a la funció c ++
  • Semàfor de recompte: El valor d’un semàfor de recompte en qualsevol punt indica el nombre màxim de processos que poden entrar a la secció crítica al mateix temps.



Funcionament del semàfor

  • Si el recompte de semàfors> 0, el fil adquireix un permís, disminuint el recompte del semàfor.

    transformacions actives i passives en informàtica
  • Altrament, el es bloqueja fins que es pot adquirir un permís.

  • Quan el fil ja no necessita accés a un recurs compartit, allibera el permís, incrementant el recompte de semàfors.



  • Si un altre fil espera un permís, aquest fil adquirirà un permís en aquest moment.

Implementació del semàfor

import java.util.concurrent. * // Prendrà Recurs com a classe de classe compartida Recurs {static int count = 0} class MyDemo extends Demo {Semaphore sem String threadName public MyDemo (Semaphore sem, String threadName) {super (threadName) this. sem = sem this.threadName = threadName} @Override public void run () {// Executa per X if (this.getName (). equals ('X')) {System.out.println ('Start' + threadName) try {// Obtindrà el permís per accedir al recurs compartit System.out.println (threadName + 'esperant un permís.') // l'adquisició del bloqueig sem.acquire () System.out.println (threadName + 'obté un permís . ') // Ara, l'accés al recurs compartit i el descans esperaran (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) } } 

Sortida-
Començant X
Starting I
X esperant un permís
Y esperant un permís
X: 1
X: 2
X: 3
X: 4
X: 5
X: 6
X: 7
X allibera el permís
Y obté el permís
I: 6
I: 5
I: 4
I: 3
I: 2
I: 1
I: 0
I releases permit
recompte: 0

quin idea és millor per a Java

Amb això, arribem al final d’aquest bloc sobre “Semàfors a Java”. Si voleu obtenir més informació sobre Java, consulteu el document per Edureka, una empresa d'aprenentatge en línia de confiança amb una xarxa de més de 250.000 estudiants satisfets repartits per tot el món. El curs de formació i certificació de Java J2EE i SOA d’Edureka està dissenyat per a estudiants i professionals que vulguin ser desenvolupador de Java. El curs està dissenyat per donar-vos un avantatge en la programació de Java i formar-vos tant per a conceptes bàsics com avançats de Java juntament amb diversos marcs Java com Hibernate i Spring.

Tens alguna pregunta? Si us plau, mencioneu-ho a la secció de comentaris d’aquest bloc “Què és el semafor a Java” i us respondrem tan aviat com sigui possible.