在学习单例模式时,我了解到具有唯一私有构造函数和静态方法的单例模式是不安全的单例,因为它会在多线程环境中中断。有多种方法,如双向锁定等可以防止这种情况。
我很好奇在java.util.Optional class中拥有非常基本的Singleton实现的要求是什么。
有三种不同的原因,仅每个原因就足以使Optional.empty()
线程安全:
-
static final
字段立即与实例一起分配,因此,赋值将在类初始值设定项中进行,这是安全的,如果初始值设定项不调用任何其他将访问此类静态变量的代码 -
Optional
对象是不可变的,唯一的实例字段是final
,因此,只要实例在构造过程中不转义,就可以从JMM的特殊安全发布保证中受益,这里就是这种情况 -
在空
Optional
的情况下,构造函数中的赋值实际上不会改变值。结果状态与此字段的默认值相同,即null
,因此,观察这个对象的未初始化状态不会对其初始化状态产生任何影响。
如前所述,仅每个点就足以使Optional.empty()
线程安全。
通常,第一点是实现单例的推荐方法,而不是双重检查锁定和类似方法,因为类初始化已经是惰性和安全的,开销尽可能小。