¿Cómo usar el semáforo de conteo en una aplicación Java concurrente?

Java Counting Semaphore mantiene un número específico de pases o permisos, y el subproceso actual debe obtener un permiso para acceder a un recurso compartido. Si un permiso ya está agotado por otros subprocesos, puede esperar hasta que el permiso esté disponible como resultado de la liberación de permisos de varios subprocesos. Esta utilidad de concurrencia puede ser muy útil para implementar un patrón de diseño productor-consumidor o implementar grupos limitados de activos como Thread Pool, DB Connection Pool, etc. La clase java.util.Semaphore es un semáforo de conteo que se inicializa con un número de permisos. 

How to Use Counting Semaphore in Concurrent Java Application?

Semaphore proporciona dos métodos principales para obtener permisos y liberar permisos

  • adquirir( ): este método adquiere un permiso si hay alguno disponible y lo devuelve inmediatamente, reduciendo el número de permisos disponibles en uno. Si el subproceso actual se interrumpe mientras espera un permiso,se lanza una InterruptedException .
  • release() : este método adquiere el número dado de permisos, si están disponibles, y regresa inmediatamente, reduciendo el número de permisos disponibles por la cantidad dada. Si el subproceso actual se interrumpe mientras espera un permiso, se lanza una InterruptedException.

Implementación:

Un semáforo binario se conoce como semáforo de conteo con un permiso porque solo tiene dos permisos estatales disponibles o permisos no disponibles. Para ejecutar la exclusión mutua o la sección crítica donde solo se permite ejecutar un subproceso, se puede usar un semáforo binario. Un subproceso espera adquirir() hasta que Thread permite la liberación dentro de la sección crítica llamando a release() en el semáforo. A continuación se muestra el conteo de semáforos de Java donde se usa el semáforo binario para proporcionar acceso exclusivo compartido a partes esenciales del código

Ejemplo:

Java

// Java Program to illustrate use Counting Semaphore
// in Concurrent Java Application
 
import java.util.concurrent.Semaphore;
 
public class SemaphoreTest {
 
    // Initialize the semaphore with the number
    // of permits required
 
    // Here only 1 permit is allowed
    Semaphore binary = new Semaphore(1);
 
    // Main driver method
    public static void main(String args[])
    {
 
        final SemaphoreTest test = new SemaphoreTest();
 
        // Thread 1
        new Thread() {
           
            // Method that should be executed for thread1
            @Override public void run()
            {
                test.mutualExclusion();
            }
        }.start();
 
        // Thread 2
        new Thread() {
           
            // Method that should be executed for thread2
            @Override public void run()
            {
                test.mutualExclusion();
            }
        }.start();
    }
 
    // Method
    private void mutualExclusion()
    {
 
        // Try block to check for exceptions
        try {
            // acquire() acts as an input to semaphore
            // to check for available permits
            binary.acquire();
 
            // Mutual exclusive region
 
            System.out.println(
                Thread.currentThread().getName()
                + " inside mutual exclusive ");
 
            // sleep() method is used to hold thread for
            // sometime Parameter is nanoseconds to be
            // holded
            Thread.sleep(1000);
        }
 
        // Catch block to handle the exception
 
        // Handling exception if thread is interrupted
        // either before or during the activity
        catch (InterruptedException e) {
 
            // Print and display the line number where
            // exception occurred
            e.printStackTrace();
        }
 
        finally {
 
            // release() method acts as output to semaphore
            // When thread operation is completed
            // release() method increase the permits
            // in the semaphore
            binary.release();
 
            // Printing the thread name
            // using the getName() method
            System.out.println(
                Thread.currentThread().getName()
                + " outside of mutual exclusive ");
        }
    }
}
Producción

Thread-0 inside mutual exclusive 
Thread-1 inside mutual exclusive 
Thread-0 outside of mutual exclusive 
Thread-1 outside of mutual exclusive 

Publicación traducida automáticamente

Artículo escrito por kapilnama1998 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *