¿Qué es Semaphore en Java y cómo usarlo?

Publicado: 2022-05-26

Sun Microsystems en 1995 nos trajo Java, que era un lenguaje de programación colaborativo, dependiente de clases y objetos y una plataforma informática. Una gran cantidad de programas y sitios web no funcionarán a menos que tenga instalado Java, y cada día se desarrollan más. Java se comercializa y se elogia por su rápida velocidad, seguridad y confiabilidad. Es un lenguaje informático creado específicamente para su uso en el mundo disperso de Internet. Se hizo teniendo en cuenta el diseño del lenguaje de programación C++, pero es más fácil de usar y aplica un enfoque de programación orientado a objetos.

Un programa ejecutivo de PG en desarrollo de software le enseña exactamente todas las habilidades necesarias para sobresalir en Java.

Ejemplo de un semáforo:

Mutex de var compartido: semáforo = 1;

Proceso i

empezar

.

.

P(mutex);

ejecutar CS;

V(mutex);

.

.

Final;

Tabla de contenido

¿Qué hace que Java se destaque?

Una comunidad dedicada de desarrolladores, arquitectos y entusiastas de Java ha probado, pulido, ampliado y validado Java. A pesar de sus raíces de casi dos décadas, Java ha evolucionado constantemente a lo largo de los años.

Java está destinado a facilitar el desarrollo de programas portátiles de alto rendimiento para una amplia gama de sistemas informáticos, por lo que respalda las nociones esenciales de accesibilidad integral e interacción entre plataformas. Las empresas pueden brindar servicios adicionales, aumentar la productividad, la comunicación y la colaboración del usuario final, y reducir drásticamente el costo de las aplicaciones empresariales y de consumo al hacer que estén disponibles en entornos heterogéneos.

¿Qué es el semáforo en Java?

Un semáforo utiliza un contador para regular el acceso a un recurso compartido. Se permite el acceso si el contador es mayor que cero. Si el valor es 0, se deniega el acceso. El contador cuenta los permisos que dan acceso al recurso compartido. Como resultado, para acceder al recurso, un subproceso primero debe obtener permiso del semáforo.

¿Como funciona?

Generalmente, mientras usa un semáforo, el subproceso que intenta acceder al recurso compartido intenta obtener permiso. Si el recuento de semáforos es mayor que cero, el subproceso obtiene permiso, lo que hace que el recuento de semáforos disminuya. De lo contrario, el hilo se detendrá hasta que se obtenga un permiso.

Cuando el subproceso ya no requiere acceso al recurso compartido, libera el permiso, lo que hace que aumente el número de semáforos. Si otro subproceso está esperando permiso, ese subproceso obtendrá uno en ese momento.

Tipos de semáforo

Hay cuatro tipos de semáforos en Java. Son los siguientes:

Semáforo binario :

Un semáforo binario solo acepta 0 y 1 como valores y se utiliza para crear exclusiones mutuas y sincronizar actividades simultáneas.

Ejemplo de semáforo binario:

clase pública BinarySemaphoreExample

{

privado booleano bloqueado = falso;

BinarySemaphore (int inicial)

{

bloqueado = (inicial == 0);

}

public void sincronizado waitForNotify() lanza InterruptedException

{

mientras (bloqueado)

{

Espere();

}

bloqueado = verdadero;

}

notificación de vacío sincronizada pública ToWakeup ()

{

si (bloqueado)

{

notificar();

}

bloqueado = falso;

}

}

Lea nuestros artículos populares relacionados con el desarrollo de software

¿Cómo implementar la abstracción de datos en Java? ¿Qué es la clase interna en Java? Identificadores de Java: definición, sintaxis y ejemplos
Comprender la encapsulación en OOPS con ejemplos Argumentos de línea de comando en C explicados Las 10 funciones y características principales de la computación en la nube en 2022
Polimorfismo en Java: conceptos, tipos, características y ejemplos ¿Paquetes en Java y cómo usarlos? Tutorial de Git para principiantes: Aprende Git desde cero

Semáforo de conteo :

En cada momento del tiempo, el valor de un semáforo de conteo representa el número máximo de procesos que pueden acceder al área crítica al mismo tiempo.

Ejemplo de conteo de semáforo:

clase pública CountingSemaphoreExample

{

señal int privada = 0;

toma de vacío sincronizada pública ()

{

esta.señal++;

esto.notificar();

}

lanzamiento de vacío sincronizado público () lanza InterruptedException

{

while(esta.señal == 0)

Espere();

esta.señal–;

}

}

Semáforo temporizado:

Los semáforos temporizados permiten que un subproceso se ejecute durante un período de tiempo determinado. Después de un cierto período, el temporizador se reinicia y se liberan todos los demás permisos.

Ejemplo de un semáforo temporizado:

clase TimedSemaphoresEjemplo

{

semáforo privado TimedSemaphore;

TimedSemaphoreExample (período largo, int slotLimit)

{

semáforo = new TimedSemaphore(período, TimeUnit.SECONDS, slotLimit);

}

booleano intentar añadir ()

{

volver semáforo.tryAcquire();

}

int ranuras disponibles()

{

volver semáforo.getAvailablePermits();

}

}

Semáforo acotado :

Podemos establecer el límite superior utilizando semáforos acotados. Se usa en lugar de contar semáforos ya que no tienen un valor de límite superior. El valor límite superior representa el número máximo de señales que se pueden almacenar.

Ejemplo de semáforo acotado :

clase pública BoundedSemaphoresExample

{

señales int privadas = 0;

privado int enlazado = 0;

public BoundedSemaphoreexample(int upperBound)

{

este.límite = límitesuperior;

}

toma sincronizada de vacío público () lanza InterruptedException

{

while(this.signals == enlazado)

Espere();

esto.señales++;

esto.notificar++;

}

lanzamiento sincronizado vacío público () lanza InterruptedException

{

while(esta.señal == 0)

Espere();

esto.señala–;

}

}

Explore nuestros cursos populares de ingeniería de software

SL. No Programas de desarrollo de software
1 Maestría en Ciencias en Ciencias de la Computación de LJMU & IIITB Programa de Certificado de Ciberseguridad Caltech CTME
2 Bootcamp de desarrollo de pila completa Programa PG en Blockchain
3 Programa Ejecutivo de Postgrado en Desarrollo de Software - Especialización en DevOps Ver todos los cursos de ingeniería de software

Características:

Un semáforo tiene las siguientes características:

  • Permite que los hilos se comuniquen entre sí.
  • Reduce el grado de sincronía. Como resultado, proporciona un método de sincronización de bajo nivel.
  • No hay valor negativo en el semáforo. Tiene un valor que puede ser mayor o igual a cero.
  • Podemos implementar el semáforo usando la operación de prueba e interrupciones y ejecutarlo usando descriptores de archivo.

Pros y contras de los semáforos:

ventajas:

  1. Permite que muchos hilos lleguen a la parte vital.
  2. Los semáforos son independientes de la máquina.
  3. Los semáforos se implementan en el código independiente de la máquina del microkernel.
  4. No se permite que múltiples procesos accedan a la sección crucial.
  5. No hay pérdida de tiempo de proceso ni de recursos, ya que siempre hay una espera ocupada en el semáforo.
  6. Son independientes de la máquina y, por lo tanto, deben ejecutarse en el código independiente de la máquina del microkernel.
  7. Permiten una gestión de recursos adaptable.

Desventajas:

  1. La inversión de prioridad es una de las restricciones más significativas de un semáforo.
  2. El sistema operativo debe realizar un seguimiento de todas las llamadas de semáforo de espera y señal.
  3. Su uso nunca es obligatorio, sino simplemente por tradición.
  4. Las acciones de espera y señal deben realizarse correctamente para evitar interbloqueos en el semáforo.
  5. Debido a que la programación de semáforos es complicada, existe la probabilidad de que no se logre la exclusión mutua.
  6. Tampoco es una estrategia realista para aplicaciones a gran escala ya que da como resultado una pérdida de modularidad.
  7. Semaphore es más susceptible a errores de programación.
  8. Un error de programación puede resultar en un interbloqueo o una violación de la exclusión mutua.

¿Cómo usar Semaphore como bloqueo?

Un semáforo se puede utilizar como bloqueo en Java. Significa que restringe el acceso al recurso. Para adquirir el bloqueo, cualquier subproceso que quiera acceder al recurso bloqueado primero debe llamar a la función de adquisición(). Después de completar el trabajo, el subproceso debe liberar el bloqueo invocando la función release(). Tenga en cuenta que el límite superior debe establecerse en 1. Un curso ejecutivo PG en desarrollo full-stack lo ayudará a dominar todas estas habilidades.

Resumen

Tener una idea clara sobre lenguajes de programación como Java es esencial para una brillante carrera como desarrollador de software. upGrad ofrece varios cursos que podrían darle el empujón correcto para una carrera prometedora. Una especialización en desarrollo de pila completa de la Universidad Purude en upGrad te enseñará todas las habilidades que necesitas para prosperar en el campo del desarrollo de software.

Aprenda cursos de desarrollo de software en línea de las mejores universidades del mundo. Obtenga Programas PG Ejecutivos, Programas de Certificado Avanzado o Programas de Maestría para acelerar su carrera.

¿Por qué necesitamos Semaphore en Java?

Un semáforo es una variable utilizada para la sincronización de procesos para gestionar procesos concurrentes. También evita un problema de carrera al controlar el acceso a un recurso compartido por varios procesos simultáneos.

¿Por qué necesitamos Counting Semaphore?

Los semáforos se utilizan a menudo para coordinar el acceso a los recursos, con el recuento de semáforos establecido en la lista de recursos totales. Cuando se otorgan o agregan recursos, los subprocesos aumentan atómicamente el conteo, y cuando se retiran recursos, los subprocesos reducen atómicamente el conteo.

¿Por qué se conoce a Semaphore como una herramienta de sincronización?

Semaphore es esencialmente una variable entera compartida por muchos hilos. Esta variable se utiliza en el entorno de multiprocesamiento para superar el problema de la sección crítica y establecer la sincronización del proceso. Esto a veces se denomina bloqueo mutex.

¿Qué es el desarrollo full-stack?

El desarrollo full-stack es la creación de los componentes front-end (lado del cliente) y back-end (lado del servidor) de una aplicación web. Los desarrolladores web completos pueden crear aplicaciones y sitios web completos en línea. Son responsables del frontend, backend, la base de datos y la depuración de aplicaciones o sitios web en línea.