Logo Studenta

Tema 14 Clase 14 - Semaforos con JAVA

¡Estudia con miles de materiales!

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

Continuar navegando

Materiales relacionados

42 pag.
Mecanismos de Sincronização: Semáforos

BUAP

User badge image

Estudiando Y Aprendendo

196 pag.
Tema 2 Memoria compartida

User badge image

Materiales Generales

13 pag.
Tema 2 2 Ejercicios

User badge image

Materiales Generales

37 pag.