Синглтон – это порождающий паттерн проектирования, который обеспечивает, что у класса есть только один экземпляр, и предоставляет к нему глобальный доступ. В многопоточной среде объект типа синглтон может создаться несколько раз, если несколько потоков одновременно пытаются его создать. Для решения этой проблемы используется двойная проверка блокировки.
Двойная проверка блокировки включает в себя проверку на параллельное выполнение дважды. Сначала мы проверяем, был ли объект создан, прежде чем мы захватили блокировку, а затем мы проверяем еще раз, после того как блокировка была захвачена.
Пример потокобезопасного Синглтона с использованием двойной проверки блокировки в Java:
public class Singleton {
private volatile static Singleton singleton;
private Singleton() {}
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton= new Singleton();
}
}
}
return singleton;
}
}
В данном примере ключевое слово volatile
используется для предотвращения своеобразного эффекта, затрагивающего поля экземпляра.
Это эффективный способ создания синглтона, поскольку он использует блокировку только при первом вызове метода getInstance()
. После этого синглтон будет кешироваться, что делает этот метод быстрым и эффективным.
Обратите внимание, что использование volatile
переменных и двойной проверкой блокировки могут иметь различные эффекты в разных версиях Java и в разных JVM, поэтому обязательно обратитесь к специфичной документации JVM, которую вы используете.