Double Checked Locking in Singleton

Hier ist meine benutzerdefinierte Klasse für Singleton-Muster. In diesem Code verwende ich die doppelt überprüfte Sperre wie folgt. Da ich in einigen Quellen viele Posts gelesen habe, ist eine doppelte Überprüfung hilfreich, da verhindert wird, dass zwei gleichzeitig ausgeführte Threads zwei unterschiedliche Objekte erzeugen.

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

Ich verstehe den obigen Code immer noch nicht so gut. Was ist das Problem, wenn zwei Threads dieselbe Codezeile ausführen, wenn die Instanz null ist?

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

Wenn das erscheint. In beiden Threads wird angezeigt, dass das Objekt null ist. dann synchronisieren sich beide. und dann,Sie überprüfen es erneut und sehen es immer noch als null. und zwei verschiedene Objekte erstellen. OOOPS.

Bitte erkläre es mir. Was habe ich falsch verstanden?

Vielen Dank :)

Antworten auf die Frage(4)

Ihre Antwort auf die Frage