¿Qué es Semaphore en Java y su uso?



Se utiliza un semáforo para la sincronización de procesos. Este blog lo guiará a través de los diferentes tipos y la implementación de semáforos en Java.

Un semáforo en controla el acceso a un recurso compartido a través de un contador. Es un sincronización de hilos construcción utilizada para enviar señales entre subprocesos para evitar señales perdidas o proteger una sección crítica. En este blog sobre semáforos en Java, entenderemos el concepto en detalle.
Los siguientes temas se tratarán en este blog:

¿Qué es Semaphore en Java?

Un semáforo es una variable utilizada para la sincronización de procesos que se utiliza para gestionar procesos concurrentes. También se utiliza para controlar el acceso a un recurso común mediante múltiples procesos concurrentes y evitar una condición de carrera.





Tipos de semáforo -

  • Semáforo binario: Un semáforo binario solo toma solo 0 y 1 como valores y se usa para implementar la exclusión mutua y sincronizar procesos concurrentes.

  • Contando semáforo: El valor de un semáforo de conteo en cualquier punto indica el número máximo de procesos que pueden ingresar a la sección crítica al mismo tiempo exacto.



    python def __init __ (auto)

Trabajo de semáforo

  • Si el recuento del semáforo> 0, el hilo adquiere un permiso, lo que reduce el recuento del semáforo.

  • De lo contrario, el está bloqueado hasta que se pueda obtener un permiso.

  • Cuando el hilo ya no necesita acceso a un recurso compartido, libera el permiso, aumentando el recuento de semáforos.



    que hace la alerta en javascript
  • Si otro hilo está esperando un permiso, ese hilo adquirirá un permiso en ese momento.

Implementación de semáforo

import java.util.concurrent. * // Tomará Resource como clase compartida class Resource {static int count = 0} class MyDemo extiende Demo {Semaphore sem String threadName public MyDemo (Semaphore sem, String threadName) {super (threadName) this. sem = sem this.threadName = threadName} @Override public void run () {// Run By X if (this.getName (). equals ('X')) {System.out.println ('Iniciando' + threadName) try {// Obtendrá el permiso para acceder a los recursos compartidos System.out.println (threadName + 'esperando un permiso.') // adquiriendo el candado sem.acquire () System.out.println (threadName + 'obtiene un permiso . ') // Ahora, acceder al recurso compartido y el resto esperará (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) } } 

Salida-
Comenzando X
Starting Y
X esperando un permiso
Y esperando un permiso
X:1
X:2
X:3
X:4
X:5
X:6
X:7
X libera el permiso
Y obtiene el permiso
Y:6
Y:5
Y:4
Y:3
Y:2
Y:1
Y:0
Y releases permit
cuenta: 0

Con esto, llegamos al final de este blog sobre “Semáforos en Java”. Si desea obtener más información sobre Java, consulte la por Edureka, una empresa de aprendizaje en línea de confianza con una red de más de 250.000 alumnos satisfechos repartidos por todo el mundo. El curso de certificación y capacitación Java J2EE y SOA de Edureka está diseñado para estudiantes y profesionales que desean ser desarrolladores de Java. El curso está diseñado para darle una ventaja en la programación de Java y capacitarlo para los conceptos básicos y avanzados de Java junto con varios marcos de Java como Hibernate y Spring.

Tienes una pregunta para nosotros? Por favor, menciónelo en la sección de comentarios de este blog 'Qué es Semaphore en Java' y nos comunicaremos con usted lo antes posible.