Идиома держателя инициализации по требованию

Идиома держателя инициализации по требованию

редактировать

В программной инженерии идиома инициализации по запросу владельца (шаблон проектирования ) - это отложенная загрузка синглтон. Во всех версиях Java эта идиома обеспечивает безопасную одновременную отложенную инициализацию статических полей с хорошей производительностью.

public class Something {private Something () {} частный статический класс LazyHolder {static final Something INSTANCE = new Something () ; } public static Something getInstance () {return LazyHolder.INSTANCE; }}

Реализация идиомы основана на фазе инициализации выполнения в виртуальной машине Java (JVM), как указано в спецификации языка Java (JLS). Когда класс Somethingзагружается JVM, класс проходит инициализацию. Поскольку в классе нет статических переменных для инициализации, инициализация завершается тривиально. Определение статического класса LazyHolderвнутри него не инициализируется, пока JVM не определит, что LazyHolderдолжен быть выполнен. Статический класс LazyHolderвыполняется только тогда, когда статический метод getInstanceвызывается в классе Something, и в первый раз, когда это происходит, JVM загружает и инициализирует LazyHolderкласс. Инициализация класса LazyHolderприводит к инициализации статической переменной INSTANCEпутем выполнения (частного) конструктора для внешнего класса Something. Поскольку JLS гарантирует, что фаза инициализации класса будет последовательной, то есть не параллельной, в статическом методе getInstanceво время загрузки и инициализации не требуется дальнейшей синхронизации. А поскольку на этапе инициализации статическая переменная INSTANCEзаписывается в последовательной операции, все последующие параллельные вызовы getInstanceбудут возвращать тот же правильно инициализированный INSTANCEбез каких-либо дополнительные накладные расходы на синхронизацию.

Содержание
  • 1 Предостережения
  • 2 См. Также
  • 3 Внешние ссылки
  • 4 Ссылки
Предостережения

Хотя реализация представляет собой эффективный потокобезопасный «одноэлементный» кэш без накладные расходы на синхронизацию и более эффективную, чем неконтролируемая синхронизация, идиома может использоваться только в том случае, если конструкция Somethingгарантированно не потерпит неудачу. В большинстве реализаций JVM, если построение Somethingзавершается неудачно, последующие попытки инициализировать его из того же загрузчика классов приведут к сбою NoClassDefFoundError.

См. Также
Внешние ссылки
Ссылки
Последняя правка сделана 2021-05-24 03:01:21
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Соглашение
О проекте