Инициализация Eager (поле static final) является потокобезопасной благодаря гарантиям загрузки классов JVM, но создает экземпляр, даже если он никогда не нужен — расточительно, если конструкция дорогая. Полностью synchronized getInstance() — это лениво и правильно, но каждый вызов оплачивает стоимость захвата блокировки навсегда, даже спустя долгое время после того, как экземпляр уже существует и никакая гонка невозможна.
Пример
// Classic GoF Singleton: enforced by the class itselfpublicclassConfigManager {
privatestaticfinalConfigManagerINSTANCE=newConfigManager();
privateConfigManager() {} // private constructor blocks any other instantiationpublicstaticConfigManagergetInstance() { return INSTANCE; }
}
Итог
Инициализация Eager (поле static final) является потокобезопасной благодаря гарантиям загрузки классов JVM, но создает экземпляр, даже если он никогда не нужен — расточительно, если конструкция дорогая.
Каков компромисс между быстрой инициализацией и синхронизированным … · Sobeso