Singleton单例模式

1、饿汉式

Singleton单例模式

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

2、饿汉式 改

Singleton单例模式

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、懒汉式 加同步锁

Singleton单例模式

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、内部类,最优写法

Singleton单例模式

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优化时,编译后指令重排,导致会返回没有初始化的对象。

上一篇:设计模式在面试中高频考点


下一篇:Dagger2入门系列二:Module&Component源码分析,android性能优化和内存优化