Что такое паттерн Singleton и как сделать его потокобезопасным?
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?
Разбор темы
- Тестирование, логирование и базовые паттерны
Unit/integration тесты, уровни логирования, MDC и Singleton без ловушек.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.