美文网首页
单例模式

单例模式

作者: b42f47238b43 | 来源:发表于2019-06-15 17:52 被阅读0次

    饿汉模式

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

    优点:这种写法比较简单,就是在类装载的时候就完成实例化。避免了线程同步问题。
    缺点:在类装载的时候就完成实例化。如果从始至终从未使用过这个实例,则会造成内存的浪费。

    懒汉模式

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

    优点:延时加载
    缺点:线程不安全

    懒汉模式优化

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

    上部分代码因为java指令重排优化导致线程并不安全,所以为了绝对线程安全可在变量前面添加volatile关键字禁止指令重排优化
    1、可见性:可见性,是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的。
    2、原子性:原子操作线程安全
    3、有序性:禁止指令重排序

    优点:延时加载,线程安全
    缺点:JDK 1.5之前 由于volatile关键字会屏蔽Java虚拟机所做的一些代码优化,可能会导致系统运行效率降低

    内部静态类

    public class Singleton {
        private Singleton() {
        }
        
        private static class SingleHelper {
            private static final Singleton instance;
        }
    
        public static Singleton getInstance() {
            return SingleHelper.instance;
        }
    }
    

    优点:延时加载,线程安全,推荐使用
    缺点:暂无

    枚举

    public enum  Singleton {
        INSTANCE;
    }
    

    优点:延时加载,线程安全,推荐使用
    缺点:JDK 1.5之后才能使用。android中使用枚举会占用较多内存

    相关文章

      网友评论

          本文标题:单例模式

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