Junior — Middle
¿Qué enfoques se pueden usar en lugar de la palabra clave synchronized para implementar el patrón Singleton en un entorno multihilo?
sobes.tech AI
Respuesta de la IA
Вместо использования ключевого слова synchronized для реализации Singleton в многопоточной среде можно применить следующие подходы:
-
Инициализация через статический вложенный класс (Initialization-on-demand holder idiom)
Этот способ использует ленивую инициализацию и гарантирует потокобезопасность без синхронизации.
public class Singleton { private Singleton() {} private static class Holder { private static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance() { return Holder.INSTANCE; } } -
Использование enum
Enum в Java гарантирует создание единственного экземпляра и потокобезопасность по умолчанию.
public enum Singleton { INSTANCE; public void someMethod() { // ... } } -
Double-checked locking с volatile
Позволяет избежать полной синхронизации при каждом вызове, синхронизируя только при первом создании экземпляра.
public class Singleton { private static volatile Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } }
Каждый из этих подходов обеспечивает потокобезопасность без постоянного использования synchronized на методе getInstance().