Существует три разных причины, каждой из которых может быть достаточно для обеспечения безопасности потока Optional.empty()
:
поле static final
немедленно присваивается экземпляру, следовательно, присваивание будет выполнено в инициализаторе класса, что безопасно, если инициализатор не вызывает какой-либо другой код, который будет обращаться к статическим переменным этого класса
Optional
объекты являются неизменяемыми, и единственным полем экземпляра является final
, следовательно, он пользуется специальной гарантией безопасной публикации JMM, если экземпляр не завершается во время построения, то есть дело здесь
в случае пустого Optional
, присваивание в конструкторе фактически не меняет значение. Состояние результата совпадает со значением по умолчанию для этого поля, то есть null
, следовательно, наблюдение неинициализированного состояния этого объекта не будет иметь никакого значения для его инициализированного состояния.
Как уже было сказано, каждой точки было бы достаточно для обеспечения безопасности потока Optional.empty()
.
Как правило, первым пунктом является рекомендуемый способ реализации синглетонов вместо двойной проверки блокировки и т. П., Поскольку инициализация класса уже ленива и безопасна с наименьшими возможными издержками.