Почему Singleton реализован очень простым способом в классе Optional в JDK - PullRequest
0 голосов
/ 26 июня 2018

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

Мне интересно, что было бы требованием для очень простой реализации Singleton в классе java.util.Optional.

1 Ответ

0 голосов
/ 26 июня 2018

Существует три разных причины, каждой из которых может быть достаточно для обеспечения безопасности потока Optional.empty():

  • поле static final немедленно присваивается экземпляру, следовательно, присваивание будет выполнено в инициализаторе класса, что безопасно, если инициализатор не вызывает какой-либо другой код, который будет обращаться к статическим переменным этого класса

  • Optional объекты являются неизменяемыми, и единственным полем экземпляра является final, следовательно, он пользуется специальной гарантией безопасной публикации JMM, если экземпляр не завершается во время построения, то есть дело здесь

  • в случае пустого Optional, присваивание в конструкторе фактически не меняет значение. Состояние результата совпадает со значением по умолчанию для этого поля, то есть null, следовательно, наблюдение неинициализированного состояния этого объекта не будет иметь никакого значения для его инициализированного состояния.

Как уже было сказано, каждой точки было бы достаточно для обеспечения безопасности потока Optional.empty().

Как правило, первым пунктом является рекомендуемый способ реализации синглетонов вместо двойной проверки блокировки и т. П., Поскольку инициализация класса уже ленива и безопасна с наименьшими возможными издержками.

...