懒汉式之双重检查
/**
* 单例模式-懒汉式之双重检查
* @author huanghuicheng
*/
public class LazyDoubleCheckSingleton {
private static volatile LazyDoubleCheckSingleton lazyDoubleCheckSingleton;
private LazyDoubleCheckSingleton() {}
public static LazyDoubleCheckSingleton getInstance() {
if (lazyDoubleCheckSingleton == null) {
synchronized (LazyDoubleCheckSingleton.class) {
if (lazyDoubleCheckSingleton == null) {
/*
* new 一个实例对象需要经过3个步骤:
* 1. 在堆上分配内存
* 2. 初始化对象
* 3. 使变量指向分配好内存空间
*
* 2、3两个步骤可能发生指令重排序,在单线程中指令重排序不影响程序执行的结果。
* 但在多线程中,会发生异常。添加volatile关键可以规避指令重排序带来的问题
*/
lazyDoubleCheckSingleton = new LazyDoubleCheckSingleton();
}
}
}
return lazyDoubleCheckSingleton;
}
}
懒汉式之静态内部类
/**
* 通过静态内部类延迟创建单例对象
* @author huanghuicheng
*/
public class StaticInnerClassSingleton {
private StaticInnerClassSingleton() {}
private static class InnerClass{
private static StaticInnerClassSingleton staticInnerClassSingleton = new StaticInnerClassSingleton();
}
public static StaticInnerClassSingleton getInstance() {
return InnerClass.staticInnerClassSingleton;
}
}
注意:静态内部类加初始化锁,通过多线程调试可以查看现象