Doble comprobación de bloqueo en Singleton
Aquí está mi clase personalizada para el patrón de singleton. En este código, uso el bloqueo de doble verificación como se muestra a continuación. Mientras leo muchas publicaciones en alguna fuente, dicen que la verificación doble es útil porque evita que dos subprocesos simultáneos se ejecuten al mismo tiempo que dos objetos diferentes.
public class DoubleCheckLocking {
public static class SearchBox {
private static volatile SearchBox searchBox;
// private constructor
private SearchBox() {}
// static method to get instance
public static SearchBox getInstance() {
if (searchBox == null) { // first time lock
synchronized (SearchBox.class) {
if (searchBox == null) { // second time lock
searchBox = new SearchBox();
}
}
}
return searchBox;
}
}
Todavía no entiendo mucho el código anterior. ¿Cuál es el problema, si dos hilos juntos ejecutan la misma línea de código cuando la instancia es nula?
if (searchBox == null) {
synchronized (SearchBox.class) {
if (searchBox == null) {
searchBox = new SearchBox();
}
}
}
Cuando eso aparezca. ambos dos hilos verán que el objeto es nulo. entonces ambos se sincronizan. y entonces,Lo vuelven a comprobar, y todavía lo ven nulo.. y crear dos objetos diferentes. OOOPS.
Por favor explique para mi ¿Qué he entendido mal?
Gracias :)