美文网首页
单例模式

单例模式

作者: Zero零夜 | 来源:发表于2022-05-07 19:20 被阅读0次

    常见的单例模式有哪几种

    最常见的有四种,饿汉式、双重检测懒汉式、静态内部类、枚举

    饿汉式单例模式是什么

    public class Singleton01 {
    
        // 静态对象 在App启动的时候就加载
        private static Singleton01 INSTANCE = new Singleton01();
    
        // 构造函数私有化保证无法创建
        private Singleton01(){}
    
        public static Singleton01 getInstance(){
            return INSTANCE;
        }
    
    }
    

    饿汉式单例模式的优缺点是什么

    优点是线程安全,使用简单,JVM保证线程安全。
    缺点是可能还没有使用的时候就会创建,但是其实无影响。可能会造成内存泄漏。
    如果不传入参数比较推荐的方式。

    为什么静态类就可以保证只有一个实例呢

    静态对象和对象无关,依赖于类,存在JVM方法区中,所以在内存中只有唯一一份。所以只要禁止修改INSTANCE的引用,就相当于INSTANCE不会修改。
    另外静态对象是GCRoot根,不会被GC回收,所以不会被重新创建。

    双重检测的懒汉模式的单例是什么

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

    双重检测的懒汉模式单例的优缺点是什么

    保证线程安全,需要的时候才创建,就是首次创建可能有一点性能消耗,几乎可以忽略

    为什么要双重检测而不是单层检测

    单层检测的话不管是否创建INSTANCE都会进入锁校验,会导致性能有消耗

    public class Singleton02 {
    
        private static Singleton02 INSTANCE;
    
        private Singleton02() { }
    
        public static Singleton02 getInstance() {
            // 每次都会进入锁校验
            synchronized (Singleton02.class) {
                if (INSTANCE == null) {
                    INSTANCE = new Singleton02();
                }
                return INSTANCE;
            }
        }
    
    }
    

    枚举的单例是什么

    public enum Singleton03 {
        INSTANCE
    }
    

    枚举单例的优缺点是什么

    简单方便,没有线程安全问题

    为什么枚举可以实现单例

    enum关键字装饰的类里面,所有参数都是被public final static修饰的,所以不能被修改。
    每一个枚举类型成员都可以看做枚举类型的实例。

    Kotlin的object class是哪种单例模式

    就是在字节码层面实现了饿汉模式

    带参数的单例要如何处理内存泄漏

    模仿Glide和LifeCycler对生命周期的处理,增加一个空Fg对生命周期做监听,当监听到onDestory的时候,将参数置为空,这样就不用担心使用者忘记关闭导致的内存泄漏了

    相关文章

      网友评论

          本文标题:单例模式

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