Только Java 5 и выше. Предположим, что многопроцессорный компьютер с общей памятью (вы, вероятно, используете его прямо сейчас).
Вот код для ленивой инициализации singleton:
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;
}
}
Следует ли объявлять 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();
}
}
}
Предполагая, что оптимизатор не переписывает код, если instance
не объявлен volatile
, он все равно будет сбрасываться в память при выходе из блока synchronized
и считываться из памяти, когда блок synchronized
вводится?
EDIT: я забыл сделать getInstance() static. Я не думаю, что это изменяет правильность ответов; вы все знали, что я имел в виду.