Синхронизированное ключевое слово Java очищает кэш?

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 (). Я не думаю, что это меняет достоверность ответов; Вы все знали, что я имел в виду.

6
задан Tom Hawtin - tackline 30 August 2010 в 15:57
поделиться