Sobes.tech
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;
    }
}