Concurrencia
n
Con varias computadoras se pueden ejecutar varios programas a la vez Con una sola computadora se puede simular la ejecucin paralela de varias actividades:
? mltiples flujos de ejecucin (multithreading)
Los threads en varias mquinas virtuales necesitan de mecanismos de comunicacin para compartir informacin
Concurrencia
n
Para qu:
n n n n n
Mejorar la disponibilidad y eficiencia Modelar tareas, objetos autnomos, animacin Paralelismo: mltiples procesadores, simultanear E/S Proteccin: aislar actividades en hilos de ejecucin Ejemplos:
Tareas con mucha E/S: acceso a sitios web, bases de datos Interfaces grficas de usuario: gestin de eventos Demonios con mltiples peticiones de servicio simultneas Simulacin
Con cuidado:
n n
Programacin concurrente OO
n
Programacin concurrente OO
n
Concurrencia y reusabilidad
n
Mayor complejidad
Criterios de correccin ms duros que con cdigo secuencial El no determinismo impide la depuracin y el entendimiento del cdigo
Programacin concurrente OO
n
Polticas de diseo
n
Ejemplos
Dependencia de estado: qu hacer cuando se recibe una peticin que no se puede realizar Disponibilidad de servicio: Restricciones en el acceso concurrente a los mtodos Restricciones de flujos: Establecer direccionabilidad y reglas de capas para los mensajes
Combaten la complejidad
Reglas de diseo de alto nivel y restricciones arquitecturales evitan decisiones caso por caso inconsistentes
Mantener la apertura
Acomodar componentes que obedecen polticas determinadas
Modelos de objetos
n
4 operaciones bsicas
n n n n
Aceptar un mensaje Actualizar el estado local Enviar un mensaje Crear un nuevo objeto
main
E/S
programa
Objeto Objeto Objeto pasivo pasivo Objeto pasivoObjeto pasivo Objeto pasivo pasivo
Juan Pavn Mestras, UCM 2001 Programacin concurrente con Java 8
mensaje
oneway
Objetos
n
n n
TADs, componentes agregados, monitores, objetos de negocio (EJBs), servlets, objetos CORBA remotos Se pueden agrupar de acuerdo a estructura, role, ... Se pueden usar para mltiples actividades
Lo ms importante es la SEGURIDAD
Actividades
n
n n
Mensajes, cadenas de llamadas, workflows, hilos de ejecucin, sesiones, escenarios, scripts, casos de uso, transacciones, flujos de datos Se pueden agrupar por origen, funcin, ... Comprenden mltiples objetos
Lo ms importante es la VIVEZA
10
Java
n
Empaquetado: objetos, clases, componentes, paquetes Portabilidad: bytecode, unicode, transportes varios Extensibilidad: Subclases, interfaces, class loader Seguridad: mquina virtual, verificadores de cdigo Bibliotecas: paquetes java.* Ubicuidad: corre en casi todas partes Concurrencia: threads, locks Distribucin: RMI, CORBA Persistencia: Serializacin, JDBC Seguridad: gestores de seguridad, dominios
11
Concurrencia en Java
n
El cdigo que ejecuta un thread se define en clases que implementan la interfaz Runnable
public interface Runnable { public void run(); }
12
Concurrencia en Java
n
Clase Thread
n n
Mtodos estticos
sleep(milisegundos) currentTread()
Concurrencia en Java
n
Creacin de Threads:
class MiThread extends Thread {...} => new MiThread() class MiThread implements Runnable {...} => new Thread(new MiThread())
14
Concurrencia en Java
import java.lang.Math ; ; import java.lang.Math class EjemploThread extends Thread {{ class EjemploThread extends Thread int numero; int numero; EjemploThread (int n) {{numero = n; }} EjemploThread (int n) numero = n; public void run() {{ public void run() try {{ while (true) {{ try while (true) System.out.println (numero); System.out.println (numero); sleep((long)(1000*Math.random())); sleep((long)(1000*Math.random())); }} }}catch (InterruptedException e) {{return; }}////acaba este thread catch (InterruptedException e) return; acaba este thread }} public static void main (String args[]) {{ public static void main (String args[]) for (int i=0; i<10; i++) for (int i=0; i<10; i++) new EjemploThread(i).start(); new EjemploThread(i).start(); }}
SALIDA
1 4 5 6 2 9 8 4 3 0 7 3 7 2 8 3 1 9 ...
}}
15
Sincronizacin en Java
n n
Por ejemplo, accesos a memoria o a un recurso a la vez synchronized mtodo (...) {...} // a nivel de objeto synchronized (objeto) { ... } // a nivel de bloque de cdigo wait() y wait(timeout) El thread se queda bloqueado hasta que algn otro le mande una seal (notify) y entonces pasa a la cola de listos para ejecutar notify() y notifyAll()
? No es fcil la correcta programacin de la concurrencia y la sincronizacin
Sincronizacin:
n n
Mtodos
n
16
Sincronizacin en Java
public class NoSincronizada extends Thread { static int n = 1; public void run() { for (int i = 0; i < 10; i++) { System.out.println(n); n++; } } public static void main(String args[]) { Thread thr1 = new NoSincronizada(); Thread thr2 = new NoSincronizada(); thr1.start(); thr2.start(); } }
Juan Pavn Mestras, UCM 2001 Programacin concurrente con Java
1 2 3 4 5 6
7 8 8 9 10 11 12 14 15 16 17 18 19 20
17
Ejercicio
n
Adaptar la clase anterior para que el resultado de la ejecucin de los dos threads en paralelo sea la secuencia de 1 a 20 sin repeticiones ni saltos de nmeros.
18
Monitores en Java
n
// ...dentro de cdigo synchronized, ya que el hilo debe ser el propietario del monitor // del objeto. Liberar el monitor hasta que lo despierten con notify o notifyAll, y // pueda retomar control del monitor try { wait(); // o wait(0); } catch (InterruptedException e) { System.out.println(Interrumpido durante el wait"); } // ...tambin dentro de cdigo synchronized notify(); // o notifyAll();
Juan Pavn Mestras, UCM 2001 Programacin concurrente con Java 19
Monitores en Java
n
Signal and exit : Despus de hacer notify el thread debe salir del monitor y el thread que recibe la seal es el siguiente en entrar en el monitor Signal and continue: El thread que recibe la seal no tiene que ser necesariamente el siguiente en entrar en el monitor ?Puede haber intromisin: Antes que el thread despertado
podra entrar un thread que estuviera bloqueado en la llamada a un mtodo synchronized
En Java:
n n n
Los monitores siguen la disciplina signal and continue Tampoco se garantiza que el thread que ms tiempo lleve esperando sea el que reciba la seal con un notify() Cuando se usa notifyAll() para pasar todos los threads en wait a la cola de listos para ejecutar, el primer thread en entrar en el monitor no ser necesariamente el que ms tiempo lleve esperando
Programacin concurrente con Java 20
10
Monitores en Java
n
Ejercicio Realizar un programa para determinar qu disciplina siguen los monitores Java
n
Una posible manera de hacerlo es creando varios threads que llaman a un mtodo de un objeto y dentro del mtodo hacen un wait(). Otro thread ser el encargado de despertarlos con notify() llamando a otro mtodo del mismo objeto Habr que sacar trazas en cada mtodo de los momentos en que un thread intenta entrar en el monitor, al hacer wait(), al despertarse, etc. Para lograr un mayor entrelazado de los threads para este experimento sera conveniente una instruccin sleep() en algunos momentos, por ejemplo antes y despus del wait() y del notify(). As el planificador podr dar entrada a otros threads.
Programacin concurrente con Java 21
En programacin secuencial:
Correccin parcial
correctamente) (Si el programa termina, realiza su funcin
En programacin concurrente:
n n n
Propiedades de seguridad
correctamente)
Propiedades de viveza (Si algo debe ocurrir, alguna vez ocurre) Equidad (Todo proceso que evoluciona lo hace recibiendo un trato
equitativo de los recursos)
Para verificar estas propiedades en un programa Java hay que entender cmo funciona la MVJ (y tambin para programar mejor...)
Programacin concurrente con Java 22
11
Variables son los lugares en los que un programa puede almacenar algo
n n
Variables de clases (static) y de objetos, y tambin componentes de arrays Las variables se guardan en una memoria principal que es compartida por todos los threads El thread trabaja con copia de las variables en la memoria de trabajo La memoria principal tiene una copia maestra de cada variable
Todo objeto Java tiene asociado un lock Los threads pueden competir para adquirir un lock
Programacin concurrente con Java 23
use
variable)
(siempre que ejecute una instruccin de la MVJ que usa el valor de la (siempre que ejecute una instruccin de la MVJ de asignacin a la variable) (para poner en la copia de la variable el valor transmitido desde memoria (para transmitir a memoria principal el valor de la copia de la variable)
principal)
(para transmitir el contenido de la copia maestra de la variable a la memoria trabajo del thread) (para poner en la copia maestra de la variable el valor transmitido desde de trabajo del thread)
write
memoria
lock unlock
(para adquirir un claim en un cerrojo particular) (para liberar un derecho sobre un cerrojo particular)
24
12
Thread
Memoria Principal
Memoria de trabajo
x x
x
use
write
x
Mquina de ejecucin
25
Las acciones realizadas por cada thread estn totalmente ordenadas Las acciones realizadas por la memoria principal sobre cualquier variable estn totalmente ordenadas Las acciones realizadas por la memoria principal sobre cualquier cerrojo estn totalmente ordenadas No se permite que ninguna accin se siga a s misma
Toda accin lock y unlock se realiza a la vez por un thread y la memoria principal Toda accin load sigue a una accin read Toda accin write sigue a una accin store
Programacin concurrente con Java 26
13
Se consideran en la MVJ como 2 variables de 32 bits cada una Son necesarias dos operaciones load, store, read o write para tratarlas Para soportar procesadores de 32 bits Aunque se admite que haya implementaciones de la MVJ con operaciones de 64bits atmicas (y actualmente se recomienda incluso)
27
Un cerrojo slo puede pertenecer a un thread en un momento dado El cerrojo slo quedar libre cuando el thread haga tantos unlock como lock hubiera hecho Un thread no puede hacer unlock de un cerrojo que no poseyera Antes de hacer una operacin unlock un thread debe copiar en memoria principal todas las variables a las que hubiera asignado Despus de hacer lock un thread debe recargar de memoria principal todas las variables que utilice
28
14
[ write x ] [ write y ]
29
15
read y
read x
unlock EjemploSincronizado
unlock EjemploSincronizado
31
Ejercicios Escribir un programa que cree dos threads y pruebe la ejecucin de las clases de los ejemplos anteriores Considerar la clase Ejercicio2 a continuacin. Qu ocurre si un thread llama a uno() mientras otro llama a dos()? Qu ocurre si los mtodos son synchronized?
class Ejercicio2 { int a=1, b=2; void uno() { a=3; b=4; } void dos() { System.out.println(a = + a + , b= + b); }
32
16
Seguridad: requisitos de integridad Viveza: requisitos de progreso Eficiencia: requisitos de efectividad Reusabilidad: requisitos composicionales
33
Propiedades de seguridad: Nada malo ocurrir Los patrones tratan bsicamente de evitar que el estado del sistema se haga inconsistente Propiedades de seguridad: Nada malo ocurrir Los patrones tratan bsicamente de evitar que el estado del sistema se haga inconsistente
34
17
Inmutabilidad: Evitar los cambios de estado Sincronizacin mediante cerrojos: Asegurar dinmicamente un acceso exclusivo Contenimiento: Asegurar estructuralmente un acceso exclusivo ocultando objetos internos Dependencia de estado: qu hacer cuando no se puede hacer nada Particin: separar los aspectos independientes de objetos y cerrojos
Programacin concurrente con Java 35
Inmutabilidad
n
public class Punto { private int x, y; // coordenadas fijas public Punto(int x, int y) { this.x = x; this.y = y; } // otros mtodos que no cambian los valores de las coordenadas public x() { return x; } public y() { return y; } }
Juan Pavn Mestras, UCM 2001 Programacin concurrente con Java 36
18
Cuando el estado de los objetos puede cambiar, es necesario sincronizar el acceso a los mtodos que pueden leer o modificar sus atributos Bsicamente puede haber dos tipos de conflictos al acceder a una variable:
Conflictos de lectura-escritura Conflictos de escritura-escritura
Uso de cerrojos:
Adquirir el objeto cerrojo al entrar en el mtodo, devolverlo al regresar Garantiza la atomicidad de los mtodos Riesgo de interbloqueos
37
38
19
cada mtodo llamado tendr que ejecutarse alguna vez Contencin: un thread no deja el procesador Reposo indefinido: un thread bloqueado nunca pasa a listo
Tras suspend nadie hace resume Tras wait nadie hace notify
Problemas de viveza:
n n
n n
Interbloqueo entre threads que se bloquean uno a otro Terminacin prematura: un thread muere antes de lo debido (p.ej. con stop) Cada mtodo llamada debera ejecutarse lo antes posible
Programacin concurrente con Java 39
Eficiencia
n
Primero la seguridad:
Asegurar que cada clase es segura (todos los mtodos como synchronized) y entonces intentar mejorar la viveza para mejorar la eficiencia Anlisis de mtodos de acceso al monitor Particin de la sincronizacin Riesgo: Puede resultar en cdigo lento o propenso a interbloqueos
Primero la viveza:
Al principio no se tienen polticas de sincronizacin, y se aaden despus con compuestos, subclases, cerrojos, etc. Riesgo: puede resultar en cdigo con errores de condiciones de carrera
40
20
Internas: el objeto est en un estado apropiado para realizar una accin Externas: el objeto recibe un mensaje de otro pidindole que realice una accin
Precondiciones
accin
Postcondiciones
41
Estrategia general:
n
Para cada condicin que necesite esperarse, escribir un bucle guardado con un wait() Asegurar que todo mtodo que cambie el estado que afecte a las condiciones guardadas invoque notifyAll() para despertar cualquier thread que estuviera esperando un cambio de estado
// ... condicion = true; n o t i f y A l l ();
42
21
43
Acciones ciegas: proceder en cualquier caso, sin garantas sobre el resultado Inaccin: ignorar la peticin si no se est en estado correcto Expulsin: Enviar una excepcin si no se est en el estado correcto Guardas: suspender hasta que se est en estado correcto Intento: proceder, ver si hubo xito, y si no, rollback Reintento: seguir intentando hasta tener xito Temporizacin: esperar o reintentar durante un tiempo, luego fallar Planificacin: iniciar primero una actividad que nos lleve a un estado correcto
Programacin concurrente con Java 44
22
Prctica
n
El applet debe implementar la interfaz Runnable Cada entidad del juego puede ser controlada por un hilo de ejecucin separado:
Para la interfaz con de usuario Jugadores Supervisin del juego etc.
45
Bibliografa
n n
Java Virtual Machine Specification, 2nd edition D. Lea, Programacin concurrente en Java. Principios y Patrones de diseo (segunda edicin). Addison-Wesley 2000 S. Hartley, Concurrent Programming with Java
46
23