вот мой пользовательский класс для singleton pattern. в этом коде я использую блокировку с двойной проверкой, как показано ниже. Когда я читаю много сообщений в каком-то источнике, они говорят, что двойная проверка полезна, потому что она предотвращает одновременное выполнение двух одновременных потоков двумя разными объектами.
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;
}
}
Я до сих пор не понимаю выше кода. В чем проблема, если два потока вместе работают с одной строкой кода, когда экземпляр имеет значение null?
if (searchBox == null) {
synchronized (SearchBox.class) {
if (searchBox == null) {
searchBox = new SearchBox();
}
}
}
Когда это появится. оба двух потока будут видеть, что объект имеет значение null. то обе синхронизируются. а затем, , они снова проверяют и все еще видят его null. и создать два разных объекта. OOOPS.
Пожалуйста, объясните мне. Что я понимаю неправильно?
Спасибо:)