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