懒汉式单例模式
/**
* 懒汉式单例模式
*/
public class LazySingleton {
/**
* lazySingleton = new LazySingleton()这一行代码实际上是分三步执行的,伪代码如下:
* 1.分配内存空间 memory = allocate()
* 2.初始化对象 instance(memory)
* 3.设置instance指向刚分配的内存地址,instance = memory,此时instance != null
* 步骤2和步骤3之间并不存在数据依赖关系,而且无论重排前后程序的执行结果并未改变,因此这种重排优化是允许的
* 所以要使用volatile修饰是为了避免出现指定重排
*/
private static volatile LazySingleton lazySingleton;
private LazySingleton() {
}
public static LazySingleton getInstance() {
//phase1:判断是否创建过实例
if (lazySingleton == null) {
//phase2:加锁
synchronized (LazySingleton.class) {
//phase3:双重检测锁,再次判断是否创建过实例
if (lazySingleton == null) {
lazySingleton = new LazySingleton();
}
}
}
return lazySingleton;
}
}