单件模式,就是在应用中只创建一个实例。
第一个版本
缺陷: 在多线程的情况下会出问题。
/**
* 1.0 版本
* 实现单件的基本定义
*/
public class Singleton(){
// 第一步: 将构造函数私有化
private Singleton(){}
// 第二步:定义一个单例的变量
private static Singleton singleton = null;
// 第三步: 提供一个公共的静态方法,使能够通过类获取到实例
public static Singleton getInstance(){
if(singleton==null){
singleton = new Singleton();
}
return singleton;
}
}
第一个版本,改进
/**
* 1.1 版本
* 实现
* 通过加锁,解决多线程中出现的问题
* 双重检查
*
* 补充: 在jvm中 : singleton = new Singleton(); 这句话做了三件事:
* 1) 给 singleton分配内容;
* 2) 调用 Singleton 的构造函数来初始化成员变量,形成实例;
* 3) 将singleton对象指向分配的内存空间(执行了这一步 singleton 才是非null了)
* jvm的指令存在重排序的优化,所以上面第二步和第三步的顺序不能保证,最终的执行
* 顺序可能是1-2-3,也可能是1-3-2。 如果是后者,则在3执行完,2未执行之前被第二个线程抢