单例模式几种方法

2019-05-05  本文已影响0人  大盗海洲

双重校验锁 DCL

public class Singleton {

    private volatile static Singleton mSingleton;

    public static Singleton getInstance(){
        if (mSingleton==null){
            synchronized (Singleton.class){//类锁与静态锁功能一致
                if (mSingleton==null){
                    mSingleton=new Singleton();
             
                }
            }
        }
        return mSingleton;
    }
}

volatile的两层含义:

静态内部类方式实现单例模式

public class Singleton {


    public Singleton() {
    }

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

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

    /**
     * 防止反序列化获取更多个对象的漏洞
     * @return
     * @throws ObjectStreamException
     */
    private Singleton readResolve()throws ObjectStreamException {
        return SingletonHolder.INSTANCE;
    }

}

枚举方式实现单例模式

public enum Singleton {
    INSTANCE;
    private SingletonTest mSingleton;

    Singleton() {
    }

    public SingletonTest getInstance() {
        if (mSingleton == null) {
            mSingleton = new SingletonTest();
        }
        return mSingleton;
    }

    public class SingletonTest {
    }
}
上一篇 下一篇

猜你喜欢

热点阅读