单例模式总结

作者: 进击的欧阳 | 来源:发表于2019-02-16 11:11 被阅读22次

    单例模式

    1.懒汉模式

    public class Singleton{
        private static Singleton instance = new Singleton();
        private Singleton(){
        }
        public static Singleton getInstance(){
            retuurn instanace;
        }
    }
    

    重点:当程序没有调用获取实例方法时,虚拟机已经加载了此类并调用了构造方法,没有延时加载的功能

    2.饿汉模式

    public class Singleton{
        private static Singleton instance;
        private Singleton(){
        }
        public static Singleton getInstance(){
            if(null == instance){
                instance = new Singleton();
            }
            return instance;
        }
    }
    

    重点:有延时加载功能,但线程不安全,当在多线程场景中,可能出现多个实例

    3.DCL

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

    重点: 实例化时虚拟机存在指令重排序优化,依然会导致线程不安全,可将instance对象用volatile修饰

    4.静态内部类

    public class Singleton{
        private Singleton(){}
        private static class SingletonHolder{
            private static final Singleton instance = new Singleton();
        }
        public static Singleton getInstance(){
            return SingletonHolder.instance;
        }
    }
    

    重点:延时加载、线程安全,推荐使用

    5.枚举

    public enum Singleton{
        INSTANCE;
    }
    

    重点:延时加载,线程安全,写法简单,如果需要自定义实例方法或者变量需要注意线程安全

    相关文章

      网友评论

        本文标题:单例模式总结

        本文链接:https://www.haomeiwen.com/subject/pbjbeqtx.html