Назад к вопросам
Junior — Middle
107
Каким образом обеспечить безопасный доступ к единственному экземпляру класса в многопоточной среде?
Компании, где спрашивали
FarZoom
Ответ от нейросети
sobes.tech AI
Для обеспечения безопасного доступа к единственному экземпляру класса (паттерн Singleton) в многопоточной среде в Java можно использовать несколько подходов:
- Синхронизированный метод getInstance() — простой способ, но может привести к снижению производительности из-за блокировки при каждом вызове:
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
- Двойная проверка блокировки (Double-checked locking) — уменьшает накладные расходы на синхронизацию:
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;
}
}
- Использование статического вложенного класса — ленивое создание экземпляра и потокобезопасность гарантируются JVM:
public class Singleton {
private Singleton() {}
private static class Holder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return Holder.INSTANCE;
}
}
Этот способ считается наиболее эффективным и простым.
- Enum Singleton — самый простой и безопасный способ, который гарантирует потокобезопасность и защиту от сериализации:
public enum Singleton {
INSTANCE;
// методы
}
Выбор подхода зависит от требований к производительности и удобству реализации.