目录

单例模式

单例模式的定义

单例模式确保一个类只有一个实例,并提供一个全局唯一访问点

单例模式的类图

https://cloud.ccczg.site/202205190023741.jpeg

单例模式的实现

饿汉式

  • static 变量在类装载的时候进行初始化
  • 多个实例的 static 变量会共享同一块内存区域 初始化类的时候就创建
public class Singleton {
    //构造私有化,防止直接new
    private Singleton(){}

    //静态初始化器(static initializer)中创建实例,保证线程安全
    private static Singleton instance = new Singleton();

    public static Singleton getInstance(){
        return instance;
    }
}

饿汉式是线程安全的,JVM在加载类时马上创建唯一的实例对象,且只会装载一次。

懒汉式

单例模式的懒汉式实现方式体现了延迟加载的思想(延迟加载也称懒加载Lazy Load,就是一开始不要加载资源或数据,等到要使用的时候才加载)

同步方法

public class Singleton {
    private static Singleton singleton;

    private Singleton(){}

    //解决了线程不安全问题,但是效率太低了,每个线程想获得类的实例的时候,都需要同步方法
    public static synchronized Singleton getInstance(){
        if(singleton == null){
            singleton = new Singleton();
        }
        return singleton;
    }
}

双重检查加锁

public class Singleton {

    //volatitle关键词确保,多线程正确处理singleton
    private static volatile Singleton singleton;
    private Singleton(){}
    public static Singleton getInstance(){
        if(singleton ==null){
            synchronized (Singleton.class){
                if(singleton == null){
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

静态内部类

public class Singleton {

    private Singleton(){}

    private static class SingletonInstance{
        private static final Singleton INSTANCE = new Singleton();
    }

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