Получить доступ

Что такое паттерн Singleton и как сделать его потокобезопасным?

SeniorТестирование и логирование
Коротко

Singleton — единственный экземпляр с глобальной точкой доступа. Потокобезопасные варианты: enum (проще всего, защищён от сериализации и рефлексии), static holder (ленивый, безопасность даёт инициализация класса), double-checked locking с volatile.

  • Eager: static final поле — безопасно, но не лениво
  • Ленивость редко важна — eager или enum обычно достаточно
  • Минусы паттерна: глобальное состояние, трудно тестировать и подменять

А ещё В Spring бины — синглтоны контейнера, а не паттерна: подменяемы и тестируемы

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Enum singleton прост и устойчив к сериализации/рефлексии лучше обычного приватного конструктора. Static holder ленив и потокобезопасен за счёт инициализации класса.

Пример

enum Registry { INSTANCE; void register(...) {...} }

class Config {
    private Config() {}
    private static class Holder { static final Config INSTANCE = new Config(); }
    static Config get() { return Holder.INSTANCE; }
}

Что хотят услышать

  • Варианты и почему они безопасны.
  • Минусы паттерна.
  • Отличие от Spring-синглтона.

Частые ошибки

  • Писать double-checked locking без volatile.
  • Использовать singleton как контейнер глобального mutable состояния.

Что спросят дальше

  • Почему singleton мешает тестам?
  • Как DI-контейнер решает singleton scope?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем