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