Laboratorio 2: FindDuplicates Objetivos: - Implementar skip guardados para asegurar las precondiciones de una Región Crítica Condicional. - Aplicar el patrón del productor/consumidor en un ejemplo real. Actividades Primera parte: - Leer y entender el código. . Mirar con más detenimiento la clase BoundedQueue, sobre todo las precondiciones (asserts) que se deben cumplir para poder hacer put() y take(). - Probar el programa y ver que saltan las aserciones que son implicadas por el invariante de representación. . Probablemente haya que usar java -ea ThreadedFindDuplicates /usr/share /usr/bin, donde ea="enable assertions". . Sigue estando la clase StoYield para generar planificaciones más ricas. . Observar el uso de Runtime.getRuntime().availableProcessors y la clase ConcurrentHashMap. - Agregar en put() y take() las aserciones que indican las precondiciones que debe cumplir la cola para poder poner y tomar. . Probar que efectivamente no se cumplen. Segunda parte: - Sincronizar para que no salten los asserts de "state dependence" (Capítulo 14 de JCIP) usando dos mecanismos: . Locks y condiciones implícitas a la clase Object: wait, notify, notifyAll (Sección 14.1.3 de JCIP). . Locks y condiciones explícitas: Lock (ReentrantLock), Condition. Usar dos variables de condición, una para dormir a los procesos que esperan por un lugar en la cola y otra para dormir a los procesos que están esperando un dato en la cola (Sección 14.4 de JCIP). Bibliografía - "Java Concurrency in Practice", http://cs.famaf.unc.edu.ar/~nicolasw/Docencia/PCeJ/jcip.pdf