VademécumVademécum\Semáforo [semaphore] (concepto)

Semáforo [semaphore] (concepto)

Es uno de los sincronizadores más clásicos para establecer zonas de exclusión mutua.

Los semáforos más sencillos son binarios. Para entrar en una zona crítica un thread debe adquirir el derecho de acceso, y al salir lo libera.

Semaphore semaphore = new Semaphore(1);

 

semaphore.acquire();

// zona crítica

semaphore.release();

 

Por solidez, nunca debemos olvidar liberar un semáforo al salir de la zona crítica. El código previo lo hace si salimos normalmente; pero si se sale de forma abrupta (return o excepción) entonces el semáforo no se liberaría. Es por ello, que normalmente se sigue este patrón:

semaphore.acquire();

try {

    // zona crítica

} finally {

    semaphore.release();

}

 

Más general, el semáforo puede llevar cuenta de N permisos. Los threads solicitan algunos permisos; si los hay, los retiran y siguen; si no los hay, quedan esperando a que los haya. Cuando ha terminado, el thread devuelve los permisos.

Ver “Semaphore”.

Ver “zonas de exclusión mutua

principio