Saltar al contenido

Semáforo Java – Javatpoint

octubre 3, 2021
java semaphore

En Java, usamos semáforo en la sincronización de subprocesos. Se utiliza para controlar el acceso a un recurso compartido que utiliza una variable de contador. Java también proporciona una Clase de semáforo que contiene constructores y varios métodos para controlar el acceso sobre el recurso compartido. Lo discutiremos más adelante en esta sección.

Antes de seguir adelante en esta sección, primero entenderemos qué es el semáforo, tipos de semáforo, cómo obras, y cómo implementar semáforo. Después de conocerlo todo, pasaremos a la Programas de semáforo de Java.

¿Qué es un semáforo?

Se utiliza un semáforo para limitar la cantidad de subprocesos que desean acceder a un recurso compartido. En otras palabras, es una variable no negativa que se comparte entre los hilos conocida como encimera. Establece el límite de los hilos. Un mecanismo en el que un hilo está esperando en un semáforo puede ser señalado por otros hilos.

  • Si contador> 0, se proporciona acceso a recursos compartidos.
  • Si contador = 0, se deniega el acceso a los recursos compartidos.

En resumen, el contador sigue rastreando la cantidad de permisos que le ha otorgado a un recurso compartido. Por lo tanto, semáforo concede permiso a los subprocesos para compartir un recurso.

Características del semáforo

Existen las siguientes características de un semáforo:

  • Proporciona sincronización entre los hilos.
  • Disminuye el nivel de sincronización. Por lo tanto, proporciona un mecanismo de sincronización de bajo nivel.
  • El semáforo no contiene un valor negativo. Tiene un valor que puede ser mayor que cero o igual a cero.
  • Podemos implementar el semáforo usando la operación de prueba y las interrupciones, y usamos los descriptores de archivo para ejecutarlo.

Trabajo de semáforo

El semáforo controla el recurso compartido a través de una variable de contador. El contador es un valor no negativo. Contiene un valor mayor que 0 o igual a 0.

  • Si contador> 0, el hilo obtiene permiso para acceder al recurso compartido y el valor del contador es decrementado por 1.
  • De lo contrario, el hilo se bloqueará hasta que se pueda obtener un permiso.
  • Cuando se completa la ejecución del hilo, no hay necesidad del recurso y el hilo lo libera. Después de liberar el recurso, el valor del contador incrementado por 1.
  • Si otro subproceso está esperando adquirir un recurso, el subproceso adquirirá un permiso en ese momento.
  • Si contador = 0, el hilo no obtiene permiso para acceder al recurso compartido.

Entendamos el funcionamiento del semáforo con la ayuda de un diagrama de flujo.

Semáforo de Java

Tipos de semáforos

Hay cuatro tipos de semáforos, que son los siguientes:

  • Contando semáforos
  • Semáforos acotados
  • Semáforos cronometrados
  • Semáforos binarios

Semáforo de Java

Discutamos uno por uno en detalle.

Contando semáforos

Los semáforos de conteo se utilizan para resolver la situación en la que más de un proceso quiere ejecutarse en la sección crítica, simultáneamente. Por lo tanto, para superar este problema utilizamos semáforo de conteo. Por ejemplo, considere el siguiente fragmento de código.

Veamos la implementación de los semáforos de conteo.

CountingSemaphoresExample.java

Semáforos acotados

Podemos establecer el límite superior usando el semáforos acotados. Se utiliza en lugar de los semáforos de conteo porque los semáforos de conteo no contienen ningún valor de límite superior. El valor del límite superior denota cuántas señales puede almacenar. Por ejemplo, considere el siguiente fragmento de código.

Veamos la implementación del semáforo acotado.

BoundedSemaphoresExample.java

Semáforos cronometrados

los semáforos cronometrados permitir que un hilo se ejecute durante un período de tiempo específico. Después de un tiempo determinado, el temporizador se reinicia y libera todos los demás permisos.

Veamos la implementación de los semáforos cronometrados.

TimedSemaphoresExample.java

Semáforos binarios

Los semáforos binarios son lo mismo que contar semáforos. Pero recuerde que solo acepta valores binarios 0 o 1. Su implementación es fácil en comparación con otros semáforos. Si el valor es 1, la operación de la señal es exitosa, de lo contrario falla.

Veamos la implementación de semáforos binarios.

BinarySemaphoresExample.java

Semáforo en Java

En Java, es un construcción de sincronización de subprocesos. La construcción utiliza una variable conocida como encimera que controla el acceso sobre el recurso compartido. Es un tipo de variable que se utiliza para gestionar procesos concurrentes y también sincronizarlos. También se usa para evitar condiciones de carrera. Restringe el número de subprocesos para acceder a un recurso compartido.

Por ejemplo, podemos restringir un archivo para acceder a hasta 10 conexiones simultáneamente.

Clase de semáforo de Java

Java proporciona una Semáforo class para implementar el mecanismo de semáforo. Pertenece a la java.util.concurrent paquete. Implementa la Serializable interfaz. Por lo tanto, no se requiere la implementación manual.

La clase Semaphore proporciona los siguientes dos constructores:

  • Semáforo (permisos int)
  • Semáforo (permisos int, feria booleana)

Semáforo (permisos int)

Crea un semáforo y analiza el número de permisos (número inicial de permisos disponibles) como argumento. Especifica la cantidad de subprocesos que pueden compartir un recurso a la vez. El valor de los permisos puede ser negativo. En tal caso, debe producirse una liberación antes de que se otorguen las adquisiciones.

Sintaxis:

Semáforo (permisos int, feria booleana)

Crea un semáforo con el número dado de permisos y la configuración de equidad dada.

Sintaxis:

Analiza dos parámetros:

  • permisos: El valor de los permisos puede ser negativo. En tal caso, la liberación debe ocurrir antes de que se otorgue cualquier adquisición.
  • justa: Si establecemos el valor en cierto, el semáforo garantiza FIFO a los hilos en el orden en que se solicitan, falso De forma predeterminada, todos los subprocesos que están esperando el permiso de concesión de recursos en un indefinido pedido.

Métodos de la clase Semaphore

La clase proporciona los siguientes métodos:

Adquirir () Método: El método adquiere los permisos del semáforo, bloqueando hasta que haya uno disponible o se interrumpa el hilo. Reduce el número de permisos disponibles en 1.

Si no hay ningún permiso disponible para el subproceso actual, el subproceso se deshabilita para fines de programación del subproceso. El hilo actual pasa al estado inactivo hasta que suceda una de dos cosas:

  • Si el otro hilo invoca el liberación() método para liberar el recurso, entonces el hilo actual obtiene los permisos.
  • Si el otro hilo interrumpe el hilo actual.

Lanza InterruptedException si se interrumpe el hilo actual. El método no devuelve ningún valor.

Sintaxis:

Método release (): Emite un permiso y lo devuelve al semáforo. Incrementa el número de permisos disponibles en 1. Si un hilo intenta adquirir un permiso, el semáforo concede permiso para adquirir el recurso que acaba de ser liberado por otros hilos. Además, ese hilo se considera para fines de programación de hilos.

Sintaxis:

método availablePermits (): El método devuelve el número de permisos disponibles en semáforo para otorgar el recurso. Por lo general, se utiliza con fines de prueba y depuración.

Sintaxis:

Entendamos los métodos anteriores a través de un ejemplo simple.

Usar semáforo como bloqueo

Java nos permite usar un semáforo como bloqueo. Es decir, bloquea el acceso al recurso. Cualquier hilo que quiera acceder al recurso bloqueado, debe llamar al adquirir() antes de acceder al recurso para adquirir el bloqueo. El hilo debe liberar el bloqueo llamando al liberación() método, después de la finalización de la tarea. Recuerde que establezca el límite superior en 1. Por ejemplo, considere el siguiente fragmento de código:

Veamos un ejemplo de un semáforo y usemos el semáforo como bloqueo.

SemaphoreAsLock.java

close