您的getSingleton()
方法正在尝试延迟初始化 SINGLETON实例,但存在以下问题:
因此竞争条件AMY会导致创建两个实例。
最好和最简单的方法是安全地懒惰地初始化一个单例 而不 同步,如下所示:
这是线程安全的,因为java类加载器的约定是所有类在使用之前都必须完成其静态初始化。同样,类加载器在被引用之前不会加载类。如果getSingleton()
同时调用两个线程,则Holder
该类仍将仅加载一次,因此new Singleton()
将仅执行一次。
这仍然是懒惰的,因为Holder
类是 只 从引用getSingleton()
的方法,所以Holder
在第一次呼叫时类只会被加载getSingleton()
而成。
不需要同步,因为此代码依赖于类加载器的内部同步,这是防弹的。