Sobes.tech
Назад к вопросам
Junior — Middle
107

Каким образом обеспечить безопасный доступ к единственному экземпляру класса в многопоточной среде?

Компании, где спрашивали
FarZoom

Ответ от нейросети

sobes.tech AI

Для обеспечения безопасного доступа к единственному экземпляру класса (паттерн Singleton) в многопоточной среде в Java можно использовать несколько подходов:

  1. Синхронизированный метод getInstance() — простой способ, но может привести к снижению производительности из-за блокировки при каждом вызове:
public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
  1. Двойная проверка блокировки (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;
    }
}
  1. Использование статического вложенного класса — ленивое создание экземпляра и потокобезопасность гарантируются JVM:
public class Singleton {
    private Singleton() {}

    private static class Holder {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return Holder.INSTANCE;
    }
}

Этот способ считается наиболее эффективным и простым.

  1. Enum Singleton — самый простой и безопасный способ, который гарантирует потокобезопасность и защиту от сериализации:
public enum Singleton {
    INSTANCE;

    // методы
}

Выбор подхода зависит от требований к производительности и удобству реализации.