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 :)

Respuestas a la pregunta(4)

Su respuesta a la pregunta