Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
CLASE 14 – 2.019 MODELO DE DESARROLLO DE PROGRAMAS Y PROGRAMACION CONCURRENTE FAC.DE INGENIERIA - UNJu SEMAFOROS CON JAVA SEMÁFORO - DEFINICIÓN Es 1variable especial (o tipo abstracto de datos) q constituye el método clásico p/restringir o permitir el acceso a recursos compartidos en un entorno de multiprocesamiento. Semaphore semaphore = new Semaphore(1); semaphore.acquire(); // zona crítica semaphore.release(); SEMÁFORO BINARIO Los semáforos más sencillos son los binarios. P/entrar en 1zona crítica un thread debe adquirir el derecho de acceso, y al salir liberarlo. SEMÁFORO – FORMA CORRECTA DE IMPLEMENTARLO semaphore.acquire(); try { // zona crítica } finally { semaphore.release(); } Nunca hay q olvidar liberar un semáforo al salir de la zona crítica. El código anterior se hace si s sale normalmente; pero si s sale d forma abrupta (return o excepción) entonces el semáforo no se libera. X eso, s sigue este patrón Un semáforo puede tener N permisos. Los threads solicitan algunos permisos; si los hay, los retiran y siguen; si no los hay, quedan esperando a q los haya. Cuando se termina, el thread devuelve los permisos. Semaphore(int permits) Crea un semáforo con un cierto número de permisos. public void acquire(int permits) throws InterruptedException Solicita unos permisos. Si no hay suficientes, queda esperando. Si los hay, s descuentan del semáforo y s sigue. Si llega una interrupción, se aborta la espera. Se usa: public void acquire() throws InterruptedException ... acquire(1) public void acquireUninterruptibly(int permits) Solicita unos permisos. Si no hay suficientes, queda esperando. Si los hay, s descuentan del semáforo y s sigue. Si llega 1interrupción, s ignora y s sigue esperando. Se usa: public void acquireUninterruptibly() … acquireUninterruptibly(1) release(int permits) Libera unos permisos q retornan a la cta.del semáforo. Si hay threads esperando, s reactivan. Se usa: release() … release(1) Métodos de la clase Semaphore (class) java.util.concurrent Ejemplo de java.util.concurrent.Semaphore Class import java.util.concurrent.Semaphore; public class SemaphoreDemo { Semaphore semaphore = new Semaphore(10); public void printLock() { try { semaphore.acquire(); System.out.println("Locks acquired"); System.out.println("Locks remaining >> " +semaphore.availablePermits()); } catch(InterruptedException ie) { ie.printStackTrace(); } Ejemplo de java.util.concurrent.Semaphore Class finally { semaphore.release(); System.out.println("Locks Released"); } } public static void main(String[] args) { final SemaphoreDemo semaphoreDemo = new SemaphoreDemo(); Thread thread = new Thread(){ @Override public void run() { semaphoreDemo.printLock(); }}; thread.start(); } } A continuación se muestra un ejemplo de un semáforo binario: Ejemplo de un Semáforo Binario public class ContadorCompartido { private int n = 0; public int getN(String id) { return n; } public void setN(String id, int n) { this.n = n; System.err.println(id + ": " + n); } } • José A. Mañas. “Java Vademécum /concurrencia”. Disponible en https://www.dit.upm.es/~pepe/libros/concurrency.pdf • Páginas web consultada, accedida en Septiembre de 2.019: o https://examples.javacodegeeks.com/core-java/util/concurrent/semaphore/java- util-concurrent-semaphore-example/ BIBLIOGRAFÍA RECOMENDADA
Compartir