0
Не помилка

Возможная ошибка в примере паттерна Одиночка

DenisA 4 роки тому оновлений 4 роки тому 2

Здравствуйте!


Текущий пример Наивный одиночка:


public class DemoSingleThread {
    public static void main(String[] args) {
        System.out.println("If you see the same value, then singleton was reused (yay!)" + "\n" +
                "If you see different values, then 2 singletons were created (booo!!)" + "\n\n" +
                "RESULT:" + "\n");
        Singleton singleton = Singleton.getInstance("FOO");
        Singleton anotherSingleton = Singleton.getInstance("BAR");
        System.out.println(singleton.value);
        System.out.println(anotherSingleton.value);
    }
}

На мой взгляд ошибка в этом примере никогда не будет воспроизведена, так как методы на создание экземпляра Одиночки вызываются последовательно одним единственным потоком main().

Ошибка может быть воспроизведена в случае, если два разных потока вызывают метод на создание экземпляра:

public class DemoSingleThread {
public static void main(String[] args) {
System.out.println("If you see the same value, then singleton was reused (yay!)" + "\n" +
"If you see different values, then 2 singletons were created (booo!!)" + "\n\n" +
"RESULT:" + "\n");

Thread t1 = new Thread(() -> {
Singleton singleton1 = Singleton.getInstance("FOO");
System.out.println(singleton1.value);
});

Thread t2 = new Thread(() -> {
Singleton singleton2 = Singleton.getInstance("BAR");
System.out.println(singleton2.value);
});

t1.start();
t2.start();
}
}

Output:

If you see the same value, then singleton was reused (yay!)
If you see different values, then 2 singletons were created (booo!!)

RESULT:

FOO
BAR

Відповідь

Відповідь
Не помилка

Здравствуйте!

Спасибо, что нашли время сообщить о проблеме! Там есть вторая вкладка, в которой и приведён многопоточный вариант, почти как у вас:

https://refactoring.guru/ru/design-patterns/singleton/java/example#example-1


Идея примеров была в том, чтобы показать что на одном потоке все ОК, но как только переходим с тем же одиночкой на многопоточность, то вылазят проблемы.

ДОБРЕ, Я ЗАДОВОЛЕНИЙ
Позначка задоволеності від DenisA 4 роки тому
Відповідь
Не помилка

Здравствуйте!

Спасибо, что нашли время сообщить о проблеме! Там есть вторая вкладка, в которой и приведён многопоточный вариант, почти как у вас:

https://refactoring.guru/ru/design-patterns/singleton/java/example#example-1


Идея примеров была в том, чтобы показать что на одном потоке все ОК, но как только переходим с тем же одиночкой на многопоточность, то вылазят проблемы.

Спасибо за ваш ответ. Да, я это заметил, но уже после того, как отправил сообщение ) А удалить его не смог уже.