No sé si está roto, sin embargo, no es realmente la solución más eficiente debido a la sincronización, que es bastante costosa. Un mejor enfoque sería utilizar la 'Inicialización On Demand Holder Idiom', que carga su singleton en la memoria la primera vez que se lo exige, como su nombre lo indica, por lo tanto, carga lenta. El mayor beneficio que obtienes con este idioma es que no necesitas sincronizar porque el JLS garantiza que la carga de la clase sea en serie.
entrada de Wikipedia detallada sobre el tema: http://en.wikipedia.org/wiki/Initialization_on_demand_holder_idiom
Otra cosa a tener en cuenta es que, dado que han surgido marcos de inyección de dependencia, tales como la primavera y Guice, instancias de clases se están creando creados y gestionados por estos contenedores y serán le proporcionará un Singleton si lo desea, por lo tanto, no vale la pena romperle la cabeza, a menos que desee aprender la idea detrás del patrón, que es útil. También tenga en cuenta que los singleton proporcionados por estos contenedores IOC son únicos por instancia de contenedor, pero normalmente tendrá un contenedor IOC por aplicación, por lo que no se convertirá en un problema.
Puede evitar este problema por completo utilizando un contenedor DI/IOC y permitiendo que el contenedor controle la vida útil del objeto en lugar de incorporar dicha lógica en el objeto en sí ... No es una respuesta, sino algo en lo que pensar. – Stimul8d
¿El código publicado aquí en la pregunta incluso cuenta como un ejemplo de bloqueo comprobado? La cerradura se revisa una vez. –
ver http://stackoverflow.com/questions/3578604/how-to-solve-the-double-checked-locking-is-broken-declaration-in-java/3578674#3578674 – irreputable