Java渴望单例创建线程安全吗?

我喜欢java中热切单身的简单性,大多数关于它的文章称它的创建线程是安全的。

class Singleton { public static final Singleton instance = new Singleton (); private Singleton (){}; public static Singleton getInstance(){ return instance; } } 

但是我听到一些声称它的创建可能毕竟不是线程安全的。 例如,一个消息来源声称如果使用多于1个类加载器或App域则不安全。

由JVM保证的Eager Singleton的创建是否是线程安全的,例如,2个线程不会意外地同时创建单例?

编辑:对象创建的线程安全性是否需要关键字final? 如果该字段不是最终的,它不是线程吗?

您使用的方法是线程安全的。 由于您没有引用您所说的声明,我无法直接解决它们。 但Java语言规范在这个主题上很明确。

在第17.5节中描述

final字段还允许程序员在没有同步的情况下实现线程安全的不可变对象。 线程安全的不可变对象被所有线程视为不可变对象,即使使用数据争用传递线程之间的不可变对象的引用也是如此。 这可以提供安全保证,防止错误或恶意代码滥用不可变类。 必须正确使用最终字段以提供不可变性的保证。

当构造函数完成时,对象被认为是完全初始化的。 在该对象完全初始化之后只能看到对象引用的线程可以保证看到该对象的最终字段的正确初始化值。