Control de Acceso a Recursos con Semáforos en Java: Exclusión Mutua y Sincronización
Clasificado en Informática
Escrito el en español con un tamaño de 3 KB
Semáforos: Control de Acceso a Recursos
Los semáforos se utilizan para controlar el acceso a un recurso compartido que tiene un número finito de instancias. Permiten resolver problemas de exclusión mutua y sincronización en entornos concurrentes.
Definición y Funcionamiento
Un semáforo es un objeto que define el sistema operativo. Posee un contador que se inicializa al crear el semáforo y una cola donde se almacenan los procesos o hilos bloqueados que esperan para usar el recurso. Una vez inicializado, solo se puede acceder y modificar el semáforo mediante dos operaciones atómicas: wait y signal.
Operación wait (Espera)
Un proceso que ejecuta la operación wait disminuye el número de instancias disponibles en uno, indicando que va a utilizar una instancia del recurso. Si el valor del contador es menor o igual a 0, significa que no hay instancias disponibles. En este caso, el proceso queda en estado Bloqueado hasta que el semáforo se libere, es decir, hasta que haya instancias disponibles. Un valor negativo del semáforo indica cuántos procesos están bloqueados esperando por el recurso. Si el valor es positivo, cualquier proceso que ejecute wait no se bloqueará.
Operación signal (Señal)
Cuando un proceso termina de usar una instancia del recurso compartido, avisa de su liberación mediante la operación signal. Esta operación aumenta el valor de instancias disponibles en el semáforo. Si el valor es negativo o menor que 0, significa que hay procesos en estado Bloqueado. En este caso, se despertará a uno de ellos, obteniéndolo de la cola. Si hay varios procesos esperando, solo uno pasará a estado Runnable. El hilo que se despierta al ejecutar signal es aleatorio y depende de la implementación de los semáforos y del sistema operativo subyacente.
Es fundamental que las operaciones wait y signal sean atómicas.
Semáforos Binarios (Mutex)
Un semáforo binario, también conocido como mutex (del inglés MUTual EXclusion, "exclusión mutua"), es un indicador de condición que registra si un único recurso está disponible o no. Se puede representar como un cerrojo sobre una sección de código. Un mutex solo puede estar en dos estados:
- Abierto: Toma el valor 1 y permite el acceso al recurso.
- Cerrado: Toma el valor 0 y bloquea el acceso al recurso. Pertenece al hilo que lo cerró.
Implementación en Java
En Java, la utilización de semáforos se realiza mediante el paquete java.util.concurrent y su clase Semaphore.