Double Checked Locking w Singleton

oto moja niestandardowa klasa dla wzorca singleton. w tym kodzie używam blokady z podwójnym sprawdzeniem, jak poniżej. Gdy czytam wiele postów w jakimś źródle, mówią, że podwójne sprawdzanie jest przydatne, ponieważ zapobiega jednoczesnemu uruchamianiu dwóch równoległych wątków, tworząc dwa różne obiekty.

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;
        }
}

Nadal tak bardzo nie rozumiem powyższego kodu. Jaki jest problem, jeśli dwa wątki razem uruchamiają ten sam wiersz kodu, gdy instancja ma wartość NULL?

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

Kiedy to się pojawi. oba dwa wątki zobaczą obiekt o wartości NULL. następnie obie synchronizują. i wtedy,sprawdzają ponownie i nadal widzą, że jest zerowa. i stwórz dwa różne obiekty. OOOPS.

Proszę mi wyjaśnić. Co rozumiem źle?

Dzięki :)

questionAnswers(4)

yourAnswerToTheQuestion