手写单例模式
DCL双重检验懒加载模式
public class LazySingleton {
//volatile 关键字修饰 防止指令重拍 创建对象时分了三个步骤
//静态私有
private volatile static LazySingleton instance = null;
//私有构造方法 ,确保不会在其他地方产生新的对象
private LazySingleton(){
}
//提供静态get方法以供调用获取唯一实例
public static LazySingleton getInstance() {
//第一个判断是 直接判断是否不为空 如果不为空 ,就直接返回 不用进入锁
//判读实例是否为null;如果为null则创建实例,否则直接返回
//之所以不锁这里,是为了在多线程下提高效率,否则每次只有一个线程可访问获取实例
if (instance == null) {
//锁住Singleton可以保证同一时间只会有一个线程进入实例化对象,保证实例的唯一性
//并且在第一次实例化完成后,之后的线程在此调用该方法的时候会在前面的if处过滤掉,不会进入锁中,提高效率
synchronized (LazySingleton.class) {
//双重判断
//如果在实例还未被创建时候,有多个线程同时进入第一层if,在此处进行二次判断,可避免多次创建实例
if (instance == null) {
instance = new LazySingleton();
return instance;
}
}
}
return instance;
}
}