Java, лениво инициализированное поле без синхронизации

Иногда, когда мне нужно лениво инициализированное поле, я использую следующий шаблон проектирования.

class DictionaryHolder {
  private volatile Dictionary dict; // some heavy object

  public Dictionary getDictionary() {
    Dictionary d = this.dict;
    if (d == null) {
      d = loadDictionary(); // costy operation
      this.dict = d;
    }
    return d;
  }
}

Похоже на Double Checking idion, но не совсем. Синхронизация отсутствует, и метод loadDictionary может быть вызван несколько раз.

Я использую этот шаблон, когда параллелизм довольно низкий. Также я принимаю во внимание следующие предположения при использовании этого шаблона: метод

  • loadDictionary всегда возвращает одни и те же данные.
  • Метод loadDictionary является потокобезопасным.

Мои вопросы:

  1. Это шаблон правильный? Другими словами, может ли getDictionary () возвращать недопустимые данные?
  2. Можно ли сделать поле dict энергонезависимым для большей эффективности?
  3. есть ли лучшее решение?
6
задан Bobby 6 April 2011 в 14:23
поделиться