Возможная ошибка в примере паттерна Одиночка
Здравствуйте!
Текущий пример Наивный одиночка:
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
Идея примеров была в том, чтобы показать что на одном потоке все ОК, но как только переходим с тем же одиночкой на многопоточность, то вылазят проблемы.
Спасибо за ваш ответ. Да, я это заметил, но уже после того, как отправил сообщение ) А удалить его не смог уже.
Сервис поддержки клиентов работает на платформе UserEcho
Здравствуйте!
Спасибо, что нашли время сообщить о проблеме! Там есть вторая вкладка, в которой и приведён многопоточный вариант, почти как у вас:
https://refactoring.guru/ru/design-patterns/singleton/java/example#example-1
Идея примеров была в том, чтобы показать что на одном потоке все ОК, но как только переходим с тем же одиночкой на многопоточность, то вылазят проблемы.