← Назад к вопросам

Как сделать Singleton ленивым

2.0 Middle🔥 201 комментариев
#ORM и Hibernate

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Lazy Singleton в Java

Lazy Singleton — это паттерн, при котором экземпляр класса создаётся не при загрузке класса, а при первом обращении к нему. Это экономит ресурсы, если синглтон никогда не используется.

Проблема: Eager Singleton

public class EagerSingleton {
    public static final EagerSingleton INSTANCE = new EagerSingleton();
    
    private EagerSingleton() {
        System.out.println("Singleton создан");
    }
}

Решение 1: Synchronized Double-Checked Locking

Классический подход с синхронизацией:

public class LazySingleton {
    private static volatile LazySingleton instance;
    
    private LazySingleton() { }
    
    public static LazySingleton getInstance() {
        if (instance == null) {
            synchronized (LazySingleton.class) {
                if (instance == null) {
                    instance = new LazySingleton();
                }
            }
        }
        return instance;
    }
}

Решение 2: Holder Pattern (Рекомендуемое)

public class LazySingleton {
    private LazySingleton() { }
    
    private static class SingletonHolder {
        private static final LazySingleton INSTANCE = new LazySingleton();
    }
    
    public static LazySingleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

Решение 3: Enum Singleton

public enum LazySingleton {
    INSTANCE;
    
    private String data = "Some data";
    
    public void doSomething() {
        System.out.println("Делаю что-то");
    }
}

public class Main {
    public static void main(String[] args) {
        LazySingleton singleton = LazySingleton.INSTANCE;
        singleton.doSomething();
    }
}

Решение 4: Spring Bean

@Component
public class ConfigService {
    public void configure() {
        System.out.println("Configuring");
    }
}

Тестирование Lazy Singleton

@Test
public void testLazySingletonIsCreatedOnce() {
    LazySingleton instance1 = LazySingleton.getInstance();
    LazySingleton instance2 = LazySingleton.getInstance();
    
    assertSame(instance1, instance2);
}
Как сделать Singleton ленивым | PrepBro