(el usuario //blanco// puede editar, Nico)
==== Ejemplos Formativos vs. Informativos ====
Dividir ejemplos en:
* Formativos: se mostrarán y pensarán en detalle
* Informativos: paseo rápido.
=== Formativos ===
* BoundedBuffer (aka Productores/Consumidores, aka BoundedCounter)
* Concurrent Vector Writing [Fei99] vs. //Hand-over-hand locking// [2.5.1.4, Lea99]
=== Informativos ===
* Nested monitor
===== Taller =====
Investigar
* Inyectar ruido en el scheduler, a través de Thread.yield() o toqueteando la JVM.
* Ver [Goe06, 12.1.6 -- Generating More Interleavings]
* Mostrar optimizaciones con algún ejemplo simple (//*[ x:=x+1; x:=x-1 ]//)
* ''javap -c'' desensabla bytecode. Listado de los [[http://java.sun.com/docs/books/jvms/second_edition/html/Mnemonics.doc.html|VM Opcodes]].
* ''-server'' en la ''jre'' optimiza más.
* Ver como meter algo de ''assert'' para los invariantes.
* En [[http://www.junit.org/index.htm|JUnit]] hay métodos ''[[http://junit.sourceforge.net/javadoc/junit/framework/Assert.html|assertTrue]]'', ''assertEqual'', etc.
* La palabra ''[[http://java.sun.com/j2se/1.4.2/docs/guide/lang/assert.html|assert]]'' está desde JDK 1.4.2.
* Algunos compiladores necesitan ''-source 1.4'' o ''-source 5.0'' para aceptarla.
* En la JVM se activa con ''java -ea'', ver también ''-esa''.
* ?Se puede hacer un ejemplo donde se muestre la sincronización de memoria ya sea con ''volatile'' o con ''synchronized''?
* Ver el sourcecode de la JVM en el scheduler y como maneja el ''wait''.
* Que hay en java.util.concurrent: ''CondVar'' sobre todo en Java 6 y Java 5, en Java 1.4.2 no está
* [[http://java.sun.com/javase/6/docs/api/java/util/concurrent/package-summary.html|Java6]]
* [[http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/package-summary.html|Java5]]
* Notar que hay opciones muy específicas en la [[http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp|HotSpot]] JVM como:
-XX:PreBlockSpin=10
Spin count variable for use with -XX:+UseSpinning.
Controls the maximum spin iterations allowed before entering operating system thread synchronization code. (Introduced in 1.4.2.)
-XX:-UseSpinning
Enable naive spinning on Java monitor before entering operating system thread synchronizaton code. (Relevant to 1.4.2 and 5.0 only.) [1.4.2, multi-processor Windows platforms: true]
== IncDecStar ==
Implementar *[ x:=x+1; x:=x-1 ]
Deducir el grado de atomicidad de x:=x+1 a partir de si se cumple el invariante 0<=x<=2.
Es notoria la diferencia entre 1 CPU y 2 CPUs en la riqueza del scheduling.
Relacionar esto con el hecho de que el planificador de Java es cooperativo en realidad, o sea no tiene Quanto.
Está bueno mostar:
* Como una mala sincronización para hacer incremento atómico falla, por ejemplo ''synchronized(this) { }'' sincroniza con el mismo objeto thread.
* Usar [[http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/atomic/AtomicInteger.html|AtomicInteger]].
* Mirar la implementación de esto que básicamente usa ''compareAndSwapInt'' que internamente usa ''sun.misc.Unsafe'', y de esta última no encontre sourcecode FIXME. Aparentemente está en los fuentes del SDK que se bajan del sitio "developers".
* Desensablar con ''javap -c'' y ver que el incremento está desacoplado. Notar los ''monitorenter'', ''monitorexit''.
36: monitorenter
37: aload_0
38: getfield #15; //Field N:LMyInt;
41: dup
42: getfield #52; //Field MyInt.value:I
45: iconst_1
46: iadd
47: putfield #52; //Field MyInt.value:I
50: aload_1
51: monitorexit
== DoubleCheckTest ==
Bill Pugh, produjo un [[http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckTest.java|ejemplo]] limpio del problema //[[http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html|The "Double-Checked Locking is Broken" Declaration]]//.
El problema es que para Java5 no saltan los errores. FIXME
== Lock-free, wait-free linked lists ==
* //"[[http://www.cs.rochester.edu/u/scott/papers/1996_PODC_queues.pdf|Simple, Fast, and Practical Non-Blocking and Blocking Concurrent Queue Algorithms]]"//
* **ABA problem**. Problema con las arquitecturas de 64bits en [[http://www.research.ibm.com/people/m/michael/RC23089.pdf|ABA Prevention Using Single-Word Instructions]]. Alguna discusión de problemas de addressing-shrink en las arquitecturas de 64bits: [[http://blogs.msdn.com/oldnewthing/archive/2004/08/17/215682.aspx|The Old New Thing : Why is the virtual address space 4GB anyway?]].
* FIXME Ver como es la implementación en ''java.util.concurrent''.
* Pensar en algo más global con Producer/Consumer.