设计模式-单例模式-饿汉和懒汉

  单例模式在编码时,可分成 饿汉和懒汉;

  饿汉式:当类进行初始化的时候,为该类分配内存,并创建对象。

  懒汉式:当类进行初始化的时候,对象不创建,等到使用的时候才创建。

  写饿汉式,记得如下:

    1. 保证单例,即构造方法得私有

    2. 变量需要是 static 和 final ,并且为变量直接创建对象(static可方便方法直接获取,final保证对象引用不可变)

    3. 获取 该类对象的方法必须是static的

  代码如下:

public class HungrySingle {

    private static final HungrySingle hs = new HungrySingle();

    private HungrySingle(){}

    public static HungrySingle getInstance(){
        return hs;
    }
}

  写双重检查懒汉式,记得如下:

    1. 保证单例,即构造方法得私有

    2. 变量需要是 static 和 volatile,不需要提前赋值。(static可方便方法直接获取,volatile避免指令重排序)

    3. 获取 该类对象的方法必须是static的

    4. 方法内部进行 双重判断 内架 一个 同步代码块。这里解释下:为啥 synchronized 前后都加了 if(xx == null)的判断,说结论:为了缓解同步锁导致的效率变慢的问题。我给大家举个例子:

  一所房子里有一部手机,一次只能进1个人,谁先进去拿走手机就是谁的,后面的人进去就没了。这样会出现什么问题?就是明明第一个就已经拿了手机走了,后面的人还一个又一个排着队进去看手机还在不在,最正确的做法是后面的人一起进去看,手机不在了可以走人了。这样效率多块呀。

  同样的道理,最外层的if(xx == null)就是为了给后面这群人(线程)所准备的

  代码如下:

public class LazySingle {

    private static volatile LazySingle lazySingle;

    private LazySingle(){}

    public static LazySingle getInstance(){
        if(lazySingle == null){
            synchronized (LazySingle.class){
                if(lazySingle == null){
                    lazySingle = new LazySingle();
                }
            }
        }
        return lazySingle;
    }
}

  对上面代码有不惑可参考:https://blog.csdn.net/yeyazhishang/article/details/90445330

posted @ 2021-03-08 16:47  爱编程DE文兄  阅读(64)  评论(0编辑  收藏  举报