Java 5 и выше. Предположим, что многопроцессорный компьютер с разделяемой памятью (вы, вероятно, используете его сейчас).
Вот код для отложенной инициализации синглтона:
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;
}
}
Нужно ли объявлять экземпляр
volatile
, чтобы оптимизатор не переписывал getInstance () следующим образом (что было бы правильно в последовательной программе):
public static MySingleton getInstance() {
if (instance == null) {
synchronized (MySingleton.class) {
// instance must be null or we wouldn't be here (WRONG!)
instance = new MySingleton();
}
}
}
Предполагая, что оптимизатор не переписывает код, если экземпляр
не объявлен как энергозависимый
, если он все еще гарантированно сбрасывается в память при выходе из блока синхронизированного
и считывается из памяти при синхронизации
блок введен?
РЕДАКТИРОВАТЬ: я забыл сделать статический getInstance (). Я не думаю, что это меняет достоверность ответов; Вы все знали, что я имел в виду.