8种单例模式的实现

Posted 阿昌喜欢吃黄桃

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了8种单例模式的实现相关的知识,希望对你有一定的参考价值。

单例模式8种写法

一、单例模式的作用

1、为什么需要单例模式?

- 节省内存和计算、
- 保证结果正确、
-  方便管理

2、使用场景

image-20210530215825769


3、 8种写法

  • 饿汉式(静态常量)—可用
*//饿汉式(静态常量) ---可用
public class Singleton1 {
    private final static Singleton1 INSTANCE = new Singleton1();

    private Singleton1(){}

    public static Singleton1 getInstance(){
        return INSTANCE;
    }
}
  • 饿汉式(静态代码块) —可用
//饿汉式(静态代码块) ---可用
public class Singleton2 {
    private final static Singleton2 INSTANCE;
    static {
        INSTANCE = new Singleton2();
    }

    private Singleton2(){}

    public static Singleton2 getInstance(){
        return INSTANCE;
    }
}
  • 懒汉试(线程不安全)—不可用
//懒汉试(线程不安全)---不可用
public class Singleton3 {

    private static Singleton3 Instance;

    private Singleton3(){}

    public static Singleton3 getInstance(){
        if (Instance == null){
            Instance = new Singleton3();
        }
        return Instance;
    }
}
  • 懒汉试(线程安全,同步方法)—不推荐使用
    • 效率太低了!!!
//懒汉试(线程安全)---不推荐
public class Singleton4 {

    private static Singleton4 Instance;

    private Singleton4(){}

    public synchronized static Singleton4 getInstance(){
        if (Instance == null){
            Instance = new Singleton4();
        }
        return Instance;
    }
}
  • 懒汉试(线程不安全,同步代码块)—不可用
//懒汉试(线程不安全,同步代码块)---不可用
public class Singleton5 {

    private static Singleton5 Instance;

    private Singleton5(){}

    public static Singleton5 getInstance(){
        if (Instance == null){
            synchronized (Singleton5.class){
                Instance = new Singleton5();
            }
        }
        return Instance;
    }
}
  • 双重检查—推荐面试时使用

image-20210530212203263

//双重检查---推荐面试时使用
public class Singleton6 {

    private volatile static Singleton6 Instance;

    private Singleton6(){}

    public static Singleton6 getInstance(){
        if (Instance == null){
            synchronized (Singleton6.class){
                //再做一次检查
                if (Instance == null){
                Instance = new Singleton6();
                }
            }
        }
        return Instance;
    }
}
  • 静态内部类 — 推荐使用
//静态内部类 --- 推荐使用
public class Singleton7 {

    private Singleton7(){}

    private static class SingletonInstance{
        //JVM会保证构造方法的线程安全问题
        private static final Singleton7 INSTANCE = new Singleton7();
    }

    public static Singleton7 getInstance(){
        return SingletonInstance.INSTANCE;
    }

}
  • 枚举 — 生产实践推荐使用
//枚举 --- 生产实践推荐使用
public enum Singleton8 {
    INSTANCE;

    //方法
    public void whatever(){ }
}

4、以上写法的对比

image-20210530215444857

5、那种单例的实现方案最好?

枚举的实现方式最好

image-20210530215626802


6、各个写法的使用场合

image-20210530215825769

以上是关于8种单例模式的实现的主要内容,如果未能解决你的问题,请参考以下文章

设计模式 - 创建型模式_7种单例模式实现

设计模式 - 创建型模式_7种单例模式实现

设计模式 - 创建型模式_7种单例模式实现

三种单例模式的实现(C++)

hashTable 和 hashMap 作缓存,实现的两种单例的区别

8种单例模式写法助你搞定面试