但是有一个简单的技巧,可以让你的代码是线程安全的实现,并不需要同步!它称为“ 按需初始化持有人”习惯用法,它看起来像这样:
public class CassandraAstyanaxConnection { private CassandraAstyanaxConnection(){ } private static class Holder { private static final CassandraAstyanaxConnection INSTANCE = new CassandraAstyanaxConnection(); } public static CassandraAstyanaxConnection getInstance() { return Holder.INSTANCE; } // rest of class omitted}此代码在首次调用时初始化实例
getInstance(),并且重要的是由于类加载器的约定,不需要同步:
- 类加载器在首次访问类时加载类(在这种情况下
Holder
,唯一的访问是在getInstance()
方法内) - 当加载了一个类,并且在任何人都可以使用它之前,请确保所有静态初始化程序都将被执行(这是在Holder静态块触发时)
- 类加载器具有自己内置的同步功能,可以确保上述两点是线程安全的
每当需要延迟初始化时,我都会使用它来做一个巧妙的小技巧。final
即使实例是延迟创建的,你也可以获得实例的奖励。还要注意代码是多么干净和简单。
编辑:你应该将所有构造函数设置为私有或受保护。设置并清空私有构造函数即可完成工作



