Sobes.tech
Назад к вопросам
Junior — Middle
75

Какие подходы можно использовать вместо ключевого слова synchronized для реализации паттерна Singleton в многопоточной среде?

Ответ от нейросети

sobes.tech AI

Вместо использования ключевого слова synchronized для реализации Singleton в многопоточной среде можно применить следующие подходы:

  1. Инициализация через статический вложенный класс (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;
        }
    }
    
  2. Использование enum

    Enum в Java гарантирует создание единственного экземпляра и потокобезопасность по умолчанию.

    public enum Singleton {
        INSTANCE;
    
        public void someMethod() {
            // ...
        }
    }
    
  3. 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().