Синхронизированный блок в Singleton Pattern (Java) - PullRequest
1 голос
/ 17 апреля 2020

У меня есть вопрос, касающийся многопоточного шаблона Singleton, который я нашел в Википедии.

public final class Singleton {

    private static volatile Singleton instance = null;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized(Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }

        return instance;
    }
}

Если синхронизированный блок не был синхронизирован, можно ли двум потокам одновременно создавать 2 объекта?

Мне нужно объяснить использование «синхронизированного» для назначения .

Спасибо и всего наилучшего

1 Ответ

0 голосов
/ 17 апреля 2020

Если бы это не было синхронизировано, вы могли бы действительно сделать, чтобы 2 потока создали 2 объекта.

  • T1: проверяет, является ли экземпляр нулевым => да! => продолжается до следующей строки
  • T2: проверяет, является ли экземпляр пустым => да! => продолжается до следующей строки
  • T1: создает объект
  • T2: создает объект

При использовании синхронизации только 1 поток может войти в синхронизированный заблокированный одновременно. .

  • T1: проверяет, является ли экземпляр пустым => да! => продолжается до следующей строки
  • T1: создает объект
  • T2: проверяет, является ли экземпляр пустым => нет! => пропускает блок

Редактировать:

Стоит отметить, что нулевая проверка внутри синхронизированного блока на самом деле очень важна - в противном случае можно было бы создать 2 объекты также. - Среди всех (в комментариях)

Еще один способ достижения паттерна синглтона заключается в следующем. Используйте этот шаблон только в том случае, если создание объекта не является большой проблемой, как только приложение запускается:

public final class Singleton {

    private static Singleton instance = new Singleton();

    private Singleton() {}

    public static Singleton getInstance() {
        return instance;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...