为什么在JDK的Optional类中以非常基本的方式实现Singleton

时间:2018-06-26 10:19:38

标签: java-8 singleton optional

在学习Singleton模式时,我了解到仅具有私有构造函数和静态方法的Singleton模式并不安全,因为它将在多线程环境中中断。有两种方法可以防止这种情况发生,例如双向锁定等。

我很好奇在java.util.Optional类中具有非常基本的Singleton实现的要求是什么。

1 个答案:

答案 0 :(得分:2)

有三个不同的原因,每一个都足以使Optional.empty()线程安全:

  • static final字段会立即分配给实例,因此,将在类初始化器中进行分配,这是安全的,如果初始化器未调用任何其他可访问该代码的代码此类的静态变量

  • Optional对象是不可变的,并且唯一的实例字段是final,因此,只要实例在构造期间不会逸出,它确实会受益于JMM的特殊安全发布保证,这里就是这种情况

  • Optional为空的情况下,构造函数中的赋值实际上不会更改该值。结果状态与该字段的默认值相同,即null,因此,观察此对象的未初始化状态对其初始化状态没有任何影响。

如前所述,仅每个点就足以使Optional.empty()成为线程安全的。

通常,第一点是推荐的实现单例而不是双重检查锁定和类似方法的方法,因为类初始化已经很懒惰且安全,并且开销可能最小。