美文网首页
Java 和 Kotlin 单例

Java 和 Kotlin 单例

作者: 赵宇_阿特奇 | 来源:发表于2023-10-09 16:29 被阅读0次

    Kotlin懒汉式

    class Singleton private constructor() {
        companion object {
            val instance: Singleton by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
                Singleton()
            }
        }
    }
    

    Kotlin懒汉式(带参数)

    class Singleton private constructor(private val name: String) {
        companion object {
            private var instance: Singleton? = null
    
            fun getInstance(name: String): Singleton {
                if (instance == null) {
                    synchronized(this) {
                        if (instance == null) {
                            instance = Singleton(name)
                        }
                    }
                }
                return instance!!
            }
        }
    
        fun printName() {
            println("Singleton name: $name")
        }
    }
    

    Kotlin饿汉式

    object Singleton
    

    Java 懒汉式,线程不安全

    是否 Lazy 初始化:
    是否多线程安全:
    实现难度:
    描述:这种方式是最基本的实现方式,这种实现最大的问题就是不支持多线程。因为没有加锁 synchronized,所以严格意义上它并不算单例模式。
    这种方式 lazy loading 很明显,不要求线程安全,在多线程不能正常工作。

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

    Java 懒汉式,线程安全

    是否 Lazy 初始化:
    是否多线程安全:
    实现难度:
    描述:这种方式具备很好的 lazy loading,能够在多线程中很好的工作,但是,效率很低,99% 情况下不需要同步。
    优点:第一次调用才初始化,避免内存浪费。
    缺点:必须加锁 synchronized 才能保证单例,但加锁会影响效率。
    getInstance() 的性能对应用程序不是很关键(该方法使用不太频繁)。

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

    Java 双检锁/双重校验锁(DCL,即 double-checked locking)

    JDK 版本:JDK1.5 起
    是否 Lazy 初始化:
    是否多线程安全:
    实现难度:较复杂
    描述:这种方式采用双锁机制,安全且在多线程情况下能保持高性能。
    getInstance() 的性能对应用程序很关键。

    public class Singleton {
        private volatile static Singleton singleton;
    
        private Singleton() {}
    
        public static Singleton getSingleton() {
            if (singleton == null) {
                synchronized (Singleton.class) {
                    if (singleton == null) {
                        singleton = new Singleton();
                    }
                }
            }
            return singleton;
        }
    }
    

    Java 饿汉式

    是否 Lazy 初始化:
    是否多线程安全:
    实现难度:
    描述:这种方式比较常用,但容易产生垃圾对象。
    优点:没有加锁,执行效率会提高。
    缺点:类加载时就初始化,浪费内存。
    它基于 classloader 机制避免了多线程的同步问题,不过,instance 在类装载时就实例化,虽然导致类装载的原因有很多种,在单例模式中大多数都是调用 getInstance 方法, 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化 instance 显然没有达到 lazy loading 的效果。

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

    相关文章

      网友评论

          本文标题:Java 和 Kotlin 单例

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