Относительно статического держателя синглтон
Я разработал синглтон разными способами в зависимости от состояния, такого как изменчивый / ленивый синглтон, активный синглтон, нормальный синглтон и через Enum, но, в частности, я хочу знать о статическом держателе паттерна синглтона, показанном ниже.
public static class Singleton {
private static class InstanceHolder {
public static Singleton instance = new Singleton();
}
private Singleton(){}
public static Singleton getInstance() {
return InstanceHolder.instance;
}
}
Пожалуйста, сообщите, при каких условиях это выгодно и каковы его преимущества.
2 ответа
Эта модель полезна как минимум по 3 причинам:
- Статическая фабрика
- Ленивая инициализация
- Поток безопасно
JVM откладывает инициализацию класса InstanceHolder до его фактического использования, и поскольку Singleton инициализируется статическим инициализатором, дополнительная синхронизация не требуется. Первый вызов getInstance любым потоком вызывает загрузку и инициализацию InstanceHolder, когда инициализация Singleton происходит через статический инициализатор.
Паттерн статического держателя также считается наиболее разумной заменой двойного контрольного замка антипаттерна.
Это способ сделать потокобезопасный ленивый синглтон, используя способ загрузки классов JVM. Вы можете узнать больше о том, почему и как правильно это реализовать, в книге Блоха "Эффективная Java".
Помните, что из testable code
Точка зрения синглетонов (и глобального состояния в целом) не выгодна и ее следует избегать.