其他分享
首页 > 其他分享> > Singleton单例模式

Singleton单例模式

作者:互联网

1、饿汉式

在这里插入图片描述

private static final Mgr01 INSTANCE = new Mgr01();
             
    public static Mgr01 getInstance(){
        return INSTANCE;
    }

2、饿汉式 改

在这里插入图片描述

3、懒汉式 线程不安全

public class Mgr01 {
    private  static  Mgr01 INSTANCE ;
    private Mgr01(){
    }
    public  static Mgr01 getInstance(){
        if (getInstance()==null){
            INSTANCE = new Mgr01();
        }else {
            return INSTANCE;
        }
        return INSTANCE;
    }
}

4、懒汉式 加同步锁

在这里插入图片描述

private static volatile Mgr01 INSTANCE ;
public synchronized static Mgr01 getInstance(){
        if (INSTANCE==null){
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            INSTANCE = new Mgr01();
        }else {
            return INSTANCE;
        }
        return INSTANCE;
    }

5、懒汉式 缩小同步锁

private static volatile Mgr01 INSTANCE ;
    private Mgr01(){
    }
    public  static Mgr01 getInstance(){
        if (INSTANCE==null){  //有实例后不在走锁
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (Mgr01.class) {
                if (INSTANCE == null) //确保只有一个实例
                    INSTANCE = new Mgr01();
            }
        }else {
            return INSTANCE;
        }
        return INSTANCE;
    }

6、内部类,最优写法

在这里插入图片描述

private Mgr01(){
    }
    public  static Mgr01 getInstance(){
        return Mgr01Holder.Instance;
    }
    private static class Mgr01Holder{
        private static final Mgr01 Instance = new Mgr01();
    }

7、枚举单例,最完美的

不但解决线程安全,还可以防止反序列化

public enum Mgr02 {
    INSTANCE;
}

单例要防止反序列化,因为一般可以通过反射,new Instance();–走的无参构造方法创建对象。枚举没有构造方法,所以防止了反序列化。
volatile,因为java语言JIT优化时,编译后指令重排,导致会返回没有初始化的对象。

标签:Singleton,return,Mgr01,模式,INSTANCE,static,private,单例,public
来源: https://blog.csdn.net/qq_43575457/article/details/121734656