饿汉模式
- 特点:不管你用还是不用,反正我帮你加载出来,并且不会有线程安全问题保证了只有一份实例。
懒汉模式(非线程安全)
- 特点:实行了懒加载,只有在你使用的时候才会帮你加载,但是在多线程情况下会有线程安全问题。
懒汉模式(线程安全)
- 特点:实行了懒加载,并且线程安全
- 注意:这里的double check是比较经典的,但是需要注意一定要使用volatile修饰实例的引用,因为如果你不用volatile修饰,当你的构造函数里去初始化一些比较重的内容时,恰好另外一个线程拿着你未初始化完全的实例去调用,从而会导致空指针异常,但是使用volatile可以有效的避免这一点。
静态内部类的形式
- 特点:即实行了懒加载,线程安全,并且不需要加锁,代码非常优雅。
枚举的形式
- 特点:在枚举中我们明确了构造方法限制为私有,在我们访问枚举实例时会执行构造方法,同时每个枚举实例都是static final类型的,也就表明只能被实例化一次,巧妙的使用的枚举实现单利(Effective java最推荐的一种)