Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa |
pc:ideas_diplomatura [2007/03/09 19:19] – nicolasw | pc:ideas_diplomatura [2018/08/10 03:03] (actual) – editor externo 127.0.0.1 |
---|
=== Informativos === | === Informativos === |
* Nested monitor | * Nested monitor |
| |
| |
| |
| |
| |
| |
* [[http://java.sun.com/javase/6/docs/api/java/util/concurrent/package-summary.html|Java6]] | * [[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]] | * [[http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/package-summary.html|Java5]] |
* Notar que hay opciones muy específicas como: | * Notar que hay opciones muy específicas en la [[http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp|HotSpot]] JVM como: |
<code> | <code> |
-XX:PreBlockSpin=10 | -XX:PreBlockSpin=10 |
* Como una mala sincronización para hacer incremento atómico falla, por ejemplo ''synchronized(this) { }'' sincroniza con el mismo objeto thread. | * 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]]. | * Usar [[http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/atomic/AtomicInteger.html|AtomicInteger]]. |
* Desensablar con ''javap -c'' y ver que el incremento está desacoplado. | * 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''. |
| <code> |
| 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 |
| </code> |
| |
| |
| |
| == 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. |
| |