Java 双判空的单例模式
实习面试好几次都被问到单例模式,每次都差点事儿,决定自己再手写一遍,不能再出错了!!!!
1 public class Single{
2 private static volatile Single instance;
// private : 不能直接从外部拿到
// volatile : 由于存在指令重排,原先创建新对象instance的过程(分配空间->指向地址)可能会被打乱,
// 导致A线程在进入第8行创建新实例时,先有了instance!=null,但实际还未分配空间赋初值,
// B来了,在第5行判不为空后直接拿走了一个还未赋初值的instance。使用volatile禁止指令重排。
3 private Single(){}
// 私有构造器
4 public static Single getInstance(){
// 获取单例的静态方法
5 if(instance == null){
// 第一个判空,如果不为空,就不用再创建一个对象了,直接拿走
6 synchronized(Single.class){
// 如果为空,则需要独占这个类来创建一个新对象,防止创建多个
7 if(instance == null){
// 再次判空。A先来,发现null,创建去了,此时B来了,在锁处等待,等待结束后先看看创建没有,如果A创好了那就不能再创建。
8 instance = new Single();
9 }
10 }
11 }
12 return instance;
13 }
14 }