Double-Checked-Locking in Singleton

hier ist meine custom class für singleton-Muster. in diesem code verwende ich double-checked-locking wie auf der Abbildung. Als ich viele Beiträge gelesen auf irgendeiner Quelle, Sie sagen, dass double check ist nützlich, weil es verhindert, dass zwei threads gleichzeitig laufen in gleichen Zeiten zwei verschiedene Objekte.

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 immer noch nicht, obigen code so viel. Was ist das problem, wenn zwei threads zusammen führen gleichen Zeile code, die, wenn die Instanz null ist ?

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

Wenn die erscheinen. die beiden threads sehen-Objekt null ist. dann die beiden synchronisieren. und dann, Sie noch einmal überprüfen, und sehe Sie immer noch null. und erstellen Sie zwei verschiedene Objekte. OOOPS.

Bitte erklären für mich. Was habe ich falsch verstehen ?

Dank 🙂

Genau die gleiche Frage hier für C# - Welt.

InformationsquelleAutor hqt | 2013-08-07

Schreibe einen Kommentar