в модели памяти Java упоминается, что: когда поток выходит из синхронизированного блока как часть освобождения связанного монитора, JMM требует, чтобы кэш локального процессора был сброшен в основную память. Аналогично, как часть получения монитора при входе в синхронизированный блок, локальные кэши становятся недействительными, так что последующие чтения будут идти непосредственно в основную память, а не в локальный кэш.
так почему в этом коде я должен объявить экземпляр как volatile, так как, когда второй поток входит в блок синхронизации, он перейдет непосредственно в основную память ??
public final class MySingleton {
private static MySingleton instance = null;
private MySingleton() { }
public static MySingleton getInstance() {
if (instance == null) {
synchronized (MySingleton.class) {
if (instance == null) {
instance = new MySingleton();
}
}
}
return instance;
}
}
Я имею в виду, когда другой поток входит в блок синхронизации и выполняет вторую проверку, которую он должен обновить из основной памяти, как упоминалось.