Как создать потокобезопасный синглтон в Java?

Создание Потокобезопасного Синглтона в Java

Синглтон – это порождающий паттерн проектирования, который обеспечивает, что у класса есть только один экземпляр, и предоставляет к нему глобальный доступ. В многопоточной среде объект типа синглтон может создаться несколько раз, если несколько потоков одновременно пытаются его создать. Для решения этой проблемы используется двойная проверка блокировки.

Двойная проверка блокировки включает в себя проверку на параллельное выполнение дважды. Сначала мы проверяем, был ли объект создан, прежде чем мы захватили блокировку, а затем мы проверяем еще раз, после того как блокировка была захвачена.

Пример потокобезопасного Синглтона с использованием двойной проверки блокировки в 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, которую вы используете.

Related Questions

Считаете ли это полезным?