Kotlin实现的懒汉式静态内部类线程安全的单例

2025-03-11 08:53 Kotlin实现的懒汉式静态内部类线程安全的单例已关闭评论
  1. 传统的懒汉式静态内部类单例实现(Java风格在Kotlin中的体现)

    class Singleton {
        private constructor()
    
        companion object {
            fun getInstance(): Singleton = InnerHolder.singleton
        }
    
        private object InnerHolder {
            val singleton: Singleton by lazy {
                Singleton()
            }
        }
    }
    

    代码说明

    • 首先,Singleton 类的构造函数是私有的,防止外部直接实例化。
    • companion object 中提供了 getInstance 方法,该方法返回 InnerHolder.singleton
    • InnerHolder 是一个私有的对象。其中 singleton 属性使用了 by lazy 委托。by lazy 是Kotlin的延迟初始化特性,它会在第一次访问 singleton 时才创建 Singleton 实例,并且 by lazy 本身是线程安全的,在多线程环境下只会初始化一次。
  2. 另一种基于静态内部类延迟加载思想的实现

    class Singleton private constructor() {
        companion object {
            private object Inner {
                val INSTANCE = Singleton()
            }
    
            fun getInstance(): Singleton = Inner.INSTANCE
        }
    }
    

    代码说明

    • Singleton 类构造函数同样是私有的。
    • companion object 中有一个私有的 Inner 对象。Inner 对象在类加载时创建,但是其中的 INSTANCE 实例是在 Inner 对象被加载时才创建,而 Inner 对象在 getInstance 方法第一次调用时才会被加载,从而实现了懒加载。并且由于类加载机制,这种方式是线程安全的。

使用示例

fun main() {
    val instance1 = Singleton.getInstance()
    val instance2 = Singleton.getInstance()
    println(instance1 === instance2) // 输出 true,表明是同一个实例
}

在这两种实现中,第一种使用 by lazy 更加显式地体现了懒加载的特性;第二种则利用了Kotlin对象和类加载机制来实现懒加载和线程安全,相对更加简洁。

当前文章价值4.51元,扫一扫支付后添加微信提供帮助!(如不能解决您的问题,可以申请退款)

你可能感兴趣的文章

来源:每日教程每日一例,深入学习实用技术教程,关注公众号TeachCourse
转载请注明出处: https://teachcourse.cn/3812.html ,谢谢支持!

资源分享

Python依赖库国内常用镜像源及用法 Python依赖库国内常用镜像源及用
kotlin基础语法 kotlin基础语法
Android项目使用到的正则表达式详细介绍和示例说明 Android项目使用到的正则表达式
生活杂谈之万网域名注册过程详解 生活杂谈之万网域名注册过程详解

评论已关闭!