Встречается на собеседованиях • сегодня
Как обеспечить создание потокобезопасного экземпляра при выполнении Singleton в многопоточной среде
В Java есть несколько способов создать потокобезопасный Singleton:
- Eager Initialization (самый простой, но создает экземпляр при загрузке класса):
java
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}- Double-Checked Locking (ленивая инициализация с синхронизацией):
java
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;
}
}- Holder Pattern (рекомендуемый способ):
java
public class Singleton {
private Singleton() {}
private static class Holder {
static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return Holder.INSTANCE;
}
}Holder Pattern - лучший вариант, так как он:
- Ленивый (инициализируется при первом вызове getInstance())
- Потокобезопасный (гарантии JVM)
- Не требует синхронизации
- Работает быстрее double-checked locking

Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
офферы быстрее!
Попробовать бесплатно
Следующий вопрос
Это единственный вопрос по вашему фильтру
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы