O que é o Semaphore em Java e seu uso?



Um semáforo é usado para a sincronização de processos. Este blog irá guiá-lo pelos diferentes tipos e implementações de semáforos em java.

Um Semaphore em controla o acesso a um recurso compartilhado por meio de um contador. É um sincronização de thread construção usada para enviar sinais entre threads para evitar sinais perdidos ou proteger uma seção crítica. Neste blog sobre Semaphores in Java, vamos entender o conceito em detalhes.
Os seguintes tópicos serão abordados neste blog:

O que é o Semaphore em Java?

Um semáforo é uma variável usada para a sincronização de processos que é usada para gerenciar processos concorrentes. Ele também é usado para controlar o acesso a um recurso comum por vários processos simultâneos e evitar uma condição de corrida.





Tipos de semáforo -

  • Semáforo binário: Um semáforo binário leva apenas 0 e 1 como valores e é usado para implementar exclusão mútua, bem como sincronizar processos simultâneos.

    mergesort em c ++
  • Semáforo de contagem: O valor de um semáforo de contagem em qualquer ponto indica o número máximo de processos que podem entrar na seção crítica ao mesmo tempo.



Trabalho de Semaphore

  • Se a contagem do semáforo> 0, o segmento adquire uma permissão, diminuindo a contagem do semáforo.

  • Caso contrário, o é bloqueado até que uma licença possa ser adquirida.

  • Quando o thread não precisa mais de acesso a um recurso compartilhado, ele libera a permissão, incrementando a contagem do semáforo.



  • Se outro encadeamento estiver aguardando uma licença, esse encadeamento adquirirá uma autorização naquele momento.

    java o que append faz

Implementação do Semaphore

import java.util.concurrent. * // Irá usar Resource como classe de classe compartilhada Resource {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 () {// Executar por X if (this.getName (). equals ('X')) {System.out.println ('Iniciando' + threadName) try {// Obterá a permissão para acessar o recurso compartilhado System.out.println (threadName + 'aguardando uma licença.') // adquirindo o bloqueio sem.acquire () System.out.println (threadName + 'obtém uma licença . ') // Agora, acessar o recurso compartilhado e o resto vai esperar por (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) } } 

Resultado-
X inicial
Y começando
X esperando por uma licença
Y esperando por uma licença
X: 1
X: 2
X: 3
X: 4
X: 5
X: 6
X: 7
X libera a licença
Y consegue a licença
Y: 6
Y: 5
Y: 4
Y: 3
Y: 2
Y: 1
Y: 0
E autorizações de liberação
contagem: 0

Com isso, encerramos este blog sobre “Semaphores in Java”. Se você deseja aprender mais sobre Java, confira o pela Edureka, uma empresa de aprendizagem online confiável com uma rede de mais de 250.000 alunos satisfeitos espalhados por todo o mundo. O curso de certificação e treinamento Java J2EE e SOA da Edureka é projetado para estudantes e profissionais que desejam ser um desenvolvedor Java. O curso foi elaborado para dar a você uma vantagem inicial na programação Java e treiná-lo para os conceitos básicos e avançados de Java, juntamente com várias estruturas Java como Hibernate e Spring.

Tem alguma questão para nós? Mencione isso na seção de comentários deste blog “What is Semaphore in Java” e nós entraremos em contato com você o mais breve possível.