Oto moja klasa niestandardowa dla wzorca singleton. w tym kodzie używam podwójnie sprawdzanego blokowania, jak poniżej. Ponieważ czytam wiele postów na jakimś źródle, mówią, że podwójne sprawdzanie jest użyteczne, ponieważ zapobiega uruchomieniu dwóch współbieżnych wątków w tym samym czasie, tworząc dwa różne obiekty.Double Checked Locking w Singleton
public class DoubleCheckLocking {
public static class SearchBox {
private static volatile SearchBox searchBox;
// private attribute of this class
private String searchWord = "";
private String[] list = new String[]{"Stack", "Overflow"};
// 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 nie rozumiem powyższego kodu tak bardzo. Na czym polega 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 obydwie synchronizują. a następnie, sprawdzają ponownie i nadal widzą ją null. i utworzyć dwa różne obiekty. OOOPS.
Proszę wyjaśnij mi. Co rozumiem źle?
Dzięki :)
Dokładnie to samo pytanie [tutaj] (https://stackoverflow.com/q/12316406/465053) dla świata C#. – RBT