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  }
posted @ 2020-03-21 16:18  PraveZ  阅读(561)  评论(0编辑  收藏  举报