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