Laboratorio 0: Program Topology (aka IncDecStar) Objetivos: - Probar en la práctica usando Java, el lema de "Topología de Programas" (Práctico 0-Ejercicio 1 y Ejemplo 3 de Capítulo 5 de "On a Method of Multiprogramming") - Entender que el grado de atomicidad es fundamental para la programación concurrente. - Probar los diversos mecanismos que provee Java5/6 para lograr atomicidad. - Forzar planificaciones más ricas usando Thread.yield() y/o máquinas con SMP (múltiples cores). Actividades: - Correr el programa y ver que eventualmente el assert de TesterThread falla. - Mirar el JavaBytecode del código usando javap -c IncDecThread - Dividirse en grupos para testear estos mecanismos para lograr atomicidad en el incremento y decremento. . Locks implícitos en todos las clases derivadas de Object (synchronized(this){}). . Enteros atómicos AtomicInteger de java.util.concurrent.atomic.AtomicInteger. . Locks explícitos que implementan la interface Lock, como por ejemplo ReentrantLock. . Probar si declarando volatile int mejora algo. - Probar que diferencias hay en cuanto a tiempos de vida de la versión no atómica, ejecutando en verdadero paralelismo y en paralelismo simulado. Probar si se consigue lo mismo agregando Thread.yield() en el código. Actividades Extras: - Compilar con optimizaciones (java -server) y mirar el bytecode generado. - Utilizar algún compilador de Java a código de máquina nativo y desensamblar el código generado para ver si el incremento/decremento es atómico. - Comprobar si se llega a los mismos resultados eliminando TesterThread y agregando los asserts dentro del código. Incluir la aserción {0