<body><script type="text/javascript"> function setAttributeOnload(object, attribute, val) { if(window.addEventListener) { window.addEventListener('load', function(){ object[attribute] = val; }, false); } else { window.attachEvent('onload', function(){ object[attribute] = val; }); } } </script> <div id="navbar-iframe-container"></div> <script type="text/javascript" src="https://apis.google.com/js/plusone.js"></script> <script type="text/javascript"> gapi.load("gapi.iframes:gapi.iframes.style.bubble", function() { if (gapi.iframes && gapi.iframes.getContext) { gapi.iframes.getContext().openChild({ url: 'https://www.blogger.com/navbar.g?targetBlogID\x3d5078236\x26blogName\x3dSoloJava+Noticias\x26publishMode\x3dPUBLISH_MODE_BLOGSPOT\x26navbarType\x3dBLUE\x26layoutType\x3dCLASSIC\x26searchRoot\x3dhttp://solojava.blogspot.com/search\x26blogLocale\x3des_ES\x26v\x3d2\x26homepageUrl\x3dhttp://solojava.blogspot.com/\x26vt\x3d2241489689991862587', where: document.getElementById("navbar-iframe-container"), id: "navbar-iframe" }); } }); </script>

SoloJava Noticias

Lo mejor del mundo IT con o sin Java

The "Double-Checked Locking is Broken" Declaration

Después de experimentar unas cuantas situaciones extrañas con multithreading en Java™, ya no confío en que synchronized funciona como uno piensa cuando se esta implementado una inicialización diferida (lazy initialization) como por ejemplo:

if (variable == null)

variable = new MiObjeto();
return variable;

Llegué a este artículo (en Inglés) que me ayudo mucho, les anexo una pequeña porción traducida de este:

Double-Checked Locking es un método ampliamente citado y utilizado como un mecanismo eficiente para implementar inicialización diferida (lazy initialization) en un ambiente multithreaded.

Desafortunadamente, este no trabajará confiablemente de una manera indepediente de la plataforma cuando se implementa en Java. Cuando se implementa en otros lenguajes, como C++, depende del modelo de memoria del procesador, los reordenamientos efectuados por el compilador y la interacción entre el compilador y la librería de sincronización. ...

...

Alexander Terekhov (TEREKHOV@de.ibm.com) llegó a una sugerencia ingeniosa para implementar double checked locking usando almacenamiento local en threads (thread local storage). Cada thread mantiene un indicador local que determina si el thread ha realizado la sincronización requerida

class Foo {

/** If perThreadInstance.get() returns a non-null value, this thread
has done synchronization needed to see initialization
of helper */
private final ThreadLocal perThreadInstance = new ThreadLocal();

private Helper helper = null;

public Helper getHelper() {
if (perThreadInstance.get() == null) createHelper();
return helper;
}

private final void createHelper() {
synchronized(this) {
if (helper == null)
helper = new Helper();
}
// Any non-null value would do as the argument here
perThreadInstance.set(perThreadInstance);
}
}
« Home | Next »
| Next »
| Next »
| Next »
| Next »
| Next »
| Next »
| Next »
| Next »
| Next »

9:14 p. m.

hola! que editor usas tu para el Java?? yo manejo el JCreator y el Eclipse =) acabo de ver tu blog por lomejorde.com.. felicidades!!

http://www.20six.co.uk/noenoe84    



» Publicar un comentario