Junior — Middle
114
Çok iş parçacıklı ortamlarda Singleton şablonunun tek örneğinin çok iş parçacığı güvenli şekilde nasıl oluşturulacağını nasıl uygularız?
AI'dan gelen yanıt
sobes.tech yapay zeka
Для потокобезопасного создания единственного экземпляра Singleton в Java часто используют паттерн с ленивой инициализацией и двойной проверкой блокировки (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;
}
}
Ключевые моменты:
volatileгарантирует видимость изменений экземпляра во всех потоках.- Первая проверка
if (instance == null)позволяет избежать блокировки после инициализации. - Вторая проверка внутри
synchronizedзащищает от создания нескольких экземпляров при одновременном доступе.
Альтернативно, можно использовать инициализацию через статический вложенный класс, что тоже потокобезопасно и проще:
public class Singleton {
private Singleton() {}
private static class Holder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return Holder.INSTANCE;
}
}