当前位置: 首页 > news >正文

Kotlin 中实现单例模式的几种常见模式

1 懒汉式,线程安全(伴生对象 + by lazy

想“懒汉”一样,拖延到首次使用时才进行初始化。

通过 companion objectlazy 实现懒加载,首次访问是才进行初始化,lazy 默认使用 LazyThreadSafetyMode.SYNCHRONIZED,确保线程安全。

class Singleton private constructor() {companion object {val instance: Singleton by lazy {Singleton()}}
}

Java 中的懒汉模式,线程安全:

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

2 懒汉式,双重检验锁(Double - Checked Locking)

通过 @Volatile 保证变量的可见性(对于变量的写操作会立即刷新到主内存中)和禁止指令重排序;通过同步代码块(synchronized)来确保线程安全。

实例在第一次被调用的时候才会被创建,实现了延迟初始化。

class Singleton private constructor() {companion object {@Volatileprivate var instance: Singleton? = nullfun getInstance(): Singleton {return instance ?: synchronized(this) {return instance ?: Singleton().also { instance = it }}}}
}

Java 中的双重检验锁模式:

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;}
}

3 饿汉式(Object 关键字)

像“饿汉”一样,立即进行初始化。

这是 Kotlin 中最简洁的单例实现方式,Kotlin 编译器会保证线程安全和单例的创建。单例类在类加载时就被初始化。

object Singleton {}

将其反编译成 Java 代码:

public final class Singleton {@NotNullpublic static final Singleton INSTANCE;private Singleton() {}static {Singleton var0 = new Singleton();INSTANCE = var0;}
}

Java 中的饿汉模式:

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

4 静态内部类(Holder 模式)

静态内部类只有在使用的时候才会被加载,从而实现了延迟初始化。通过 Kotlin 的类加载机制保证线程安全。

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

Java 中的静态内部类:

public class Singleton {private Singleton() {}public static Singleton getInstance() {return Holder.INSTANCE;}private static class Holder {private static Singleton INSTANCE = new Singleton();}
}

相关文章:

  • pcie协议复位
  • WPF MVVM进阶系列教程(一、对话框)
  • AGV导航控制器技术方案——基于EFISH-SBC-RK3576/SAIL-RK3576的国产化革新‌(新一代工业级自主可控解决方案)‌
  • Ubuntu 第11章 网络管理
  • 每日一题洛谷P1025 [NOIP 2001 提高组] 数的划分c++
  • string--OJ4
  • 铁塔基站项目用电能表有哪些?
  • LeetCode 热题 100_最长回文子串(93_5_中等_C++)(暴力破解法;动态规划)
  • Java中对象集合转换的优雅实现【实体属性范围缩小为vo】:ListUtil.convert方法详解
  • 数造科技携 DataBuilder 亮相安徽科交会,展现“DataOps +AI”双引擎魅力
  • 什么是智能合约?区块链上的自动化契约
  • si551x时钟芯片linux下调试总结
  • 【论文阅读】Adversarial Training Towards Robust Multimedia Recommender System
  • 物流无人机结构与载货设计分析!
  • 无人机上的热成像相机可以单独使用吗?
  • 准确--Notepad++ 实用的插件介绍
  • 定长滑动窗口---初阶篇
  • ​​大疆无人机“指点飞行模式”​​(TapFly)
  • HarmonyOS Next~HarmonyOS应用测试全流程解析:从一级类目上架到二级类目专项测试
  • HarmonyOS运动开发:如何集成百度地图SDK、运动跟随与运动公里数记录
  • 《三餐四季》广东篇今晚开播:食在岭南,遇见百味
  • 国内大模型人才大战打响!大厂各出奇招
  • 伊朗外长称正与美国进行“善意”的会谈
  • 讲座预告|全球贸易不确定情况下企业创新生态构建
  • 新买宝马竟是“维修车”,男子发视频维权被4S店索赔100万
  • 经济日报整版聚焦“妈妈岗”:就业路越走越宽,有温度重实效