Ответ 1: static synchronized
методы используют объект класса в качестве блокировки - т.е. в этом случае Singleton.class
.
Ответ 2: Язык Java, среди прочего:
- загружает классы при первом обращении к ним / их использовании
- гарантирует, что перед разрешением доступа к классу все статические инициализаторы завершили
Эти два факта означают, что внутренняя статическаякласс SingletonHolder
не загружается, пока не будет вызван метод getInstance ().В этот момент, и до того, как потоку, выполняющему вызов, будет предоставлен доступ к нему, статический экземпляр этого класса создается как часть загрузки класса.
Все это означает, что у нас безопасная отложенная загрузка, и без любой требуется для синхронизации / блокировок!
Этот шаблон для использования синглетами.Он превосходит другие шаблоны, потому что MyClass.getInstance()
является отраслевым стандартом де-факто для синглетонов - каждый, кто его использует, автоматически знает, что он имеет дело с одноэлементным кодом (с кодом, это всегда хорошо, чтобы быть очевидным), поэтому этот шаблон имеет правильный API и правильная реализация под капотом.
кстати Статья Билла Пью стоит прочитать для полноты при понимании одноэлементных паттернов.