Duplo verificado bloqueio em singleton

aqui é minha classe personalizada para o padrão singleton. neste código, eu uso o bloqueio verificado como abaixo. Como eu leio muitos posts em alguma fonte, eles dizem que checagem dupla é útil porque evita que dois threads simultâneos executados ao mesmo tempo façam dois 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;
        }
}

Eu ainda não entendo muito o código acima. Qual é o problema, se dois segmentos juntos executarem a mesma linha de código quando a instância for nula?

if (searchBox == null) {
                synchronized (SearchBox.class) {
                    if (searchBox == null) {
                        searchBox = new SearchBox();
                    }
                }
            }

Quando isso aparecer. ambos os dois segmentos verão objeto é nulo. então ambos sincronizam. e depois,eles verificam novamente, e ainda vêem nulo. e crie dois objetos diferentes. OOOPS.

Por favor, explique para mim. O que eu entendi errado?

Obrigado :)

questionAnswers(4)

yourAnswerToTheQuestion