Встречается на собеседованиях • сегодня

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

В Java есть несколько способов создать потокобезопасный Singleton:

  1. Eager Initialization (самый простой, но создает экземпляр при загрузке класса):
java
public class Singleton {
    private static final Singleton INSTANCE = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() {
        return INSTANCE;
    }
}
  1. 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;
    }
}
  1. 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
Sophi
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
Попробовать бесплатноArrow

Следующий вопрос

Это единственный вопрос по вашему фильтру

как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы