【设计模式】单例模式

定义

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

适用场景

  • 类中的方法是与状态无关的,且需要控制实例数目,节省系统资源
  • 常用于数据库连接池、日志对象、缓存等

单例模式的实现方式

1、使用spring的bean容器管理进行创建,创建的实例默认都是单例,且线程安全。(推荐)

2、懒汉式-非线程安全(不推荐)

优点:实现方便,延迟初始化,只有在使用时才会初始化
缺点:线程不安全,多线程访问下会有问题

public class Singleton {

    private Singleton(){}

    private static Singleton singleton ;

    public static Singleton getInstance(){
        if (singleton == null)
            singleton = new Singleton();
        return singleton;
    }

}

3、懒汉式-线程安全(不推荐)

优点:实现方便,延迟初始化,线程安全
缺点:利用synchronized关键字保证线程安全,每次访问都会加锁,如果访问频率过高会影响性能

public class Singleton {

    private Singleton(){}

    private static Singleton singleton ;

    public static synchronized Singleton getInstance(){
        if (singleton == null)
            singleton = new Singleton();
        return singleton;
    }

}

4、懒汉式-双重检验-线程安全(推荐)

优点:实现方便,延迟初始化,线程安全且多线程下也能保证性能

public class Singleton {

    private Singleton(){}

    private volatile static Singleton singleton;

    public static Singleton getInstance(){
        if (singleton == null){
            synchronized (Singleton.class){
                if (singleton == null){
                    singleton = new Singleton();
                }
            }

        }
        return singleton;
    }

}

5、饿汉式-线程安全(推荐)

优点:实现方便,线程安全
缺点:如果对象不被使用会浪费内存

public class Singleton {

    private Singleton(){}

    private static Singleton singleton = new Singleton();

    public static Singleton getInstance(){
        return singleton;
    }

}

6、静态内部类-线程安全(推荐)

优点:实现方便,延迟初始化,利用类加载保证了线程安全,多线程下也能保证性能

public class Singleton {

    private Singleton(){}
    private static class SingleInnerClass{
        private static final Singleton SINGLE = new Singleton();
    }

    public static final Singleton getInstance(){
        return SingleInnerClass.SINGLE;
    }

}

一般情况下推荐使用1,5,如果明确表示需要延迟加载则推荐6,4

posted @ 2023-12-13 22:22  此木|西贝  阅读(36)  评论(0)    收藏  举报