Вопрос с собеседования · Java

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

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

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

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

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

Подробно

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 состояния.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Enum, static holder или double-checked locking с volatile
  • ✗Только synchronized на весь метод getInstance — других безопасных способов нет
  • ✗Обычное ленивое поле без синхронизации: присвоение ссылки в Java атомарно, значит, и объект виден целиком
  • ✗Пометить конструктор как private — этого достаточно для любого числа потоков

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

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

Разбор темы

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

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования