Kotlin下的5种单例模式:从“饿汉”到“高阶玩家”的进化史
Kotlin下的5种单例模式:从“饿汉”到“高阶玩家”的进化史
在Kotlin的世界里,单例模式就像游戏里的“隐藏关卡”,看似简单,实则暗藏玄机。今天,我们就用“吃货”的视角,带大家解锁Kotlin中5种单例模式的正确姿势——从“饿汉”的急性子,到“懒汉”的拖延症,再到“双重校验锁”的强迫症,最后甚至能召唤出“枚举大神”和“静态内部类”这种隐藏BOSS![1][3][4][6][7][10][11]
1. 饿汉式:急性子的“吃货”
特点:类加载时就吃光所有资源,线程安全但可能浪费。
代码:
object SingletonHunger {
init { println("饿汉式:我出生就吃饱了!") }
fun eat() { println("啃着鸡腿看世界~") }
}
场景:适合全局配置、轻量级工具类(比如日志工具)。
幽默解读:饿汉式就像你刚进火锅店就点满一桌菜,不管吃不吃得下,先占着再说![11]
2. 懒汉式:拖延症晚期患者
特点:第一次被调用时才“起床干活”,但需要同步锁防多线程抢饭吃。
代码:
class SingletonLazy private constructor() {
companion object {
@Volatile private var instance: SingletonLazy? = null
fun getInstance(): SingletonLazy {
return instance ?: synchronized(this) {
instance ?: SingletonLazy().also { instance = it }
}
}
}
fun eat() { println("懒汉式:等我刷完手机再吃饭!") }
}
场景:资源密集型对象(如数据库连接池)。
幽默解读:懒汉式就像你躺在床上喊外卖,结果5个骑手同时敲门,最后还得自己爬起来开门。[11]
3. 双重校验锁(DCL):强迫症的“完美主义”
特点:结合懒加载和线程安全,用@Volatile防止指令重排序,性能最优。
代码:
class SingletonDCL private constructor() {
companion object {
@Volatile private var instance: SingletonDCL? = null
fun getInstance(): SingletonDCL {
return instance ?: synchronized(this) {
instance ?: SingletonDCL().also { instance = it }
}
}
}
fun eat() { println("DCL:先检查碗干不干净,再动筷子!") }
}
场景:高频访问的缓存服务、性能敏感型模块。
幽默解读:DCL就像你吃饭前非要先擦桌子、摆碗筷、拍照发朋友圈,确认一切完美才动筷。[11]
4. 静态内部类:JVM的“黑科技”
特点:利用类加载机制实现延迟加载和线程安全,无显式同步锁。
代码:
class SingletonHolder private constructor() {
companion object {
val instance = Holder.INSTANCE
}
private object Holder {
val INSTANCE = SingletonHolder()
}
fun eat() { println("静态内部类:我的饭在另一个锅里热着~") }
}
场景:IO密集型服务(如文件解析器)。
幽默解读:静态内部类就像你妈把饭藏在厨房,你喊一声“妈我饿了”,她才从锅里端出热乎的。[11]
5. 枚举单例:JVM的“终极保镖”
特点:绝对线程安全,防止反射攻击和序列化破坏,代码最简洁。
代码:
enum class SingletonEnum {
INSTANCE;
fun eat() { println("枚举:我是JVM亲生的,谁也别想动我饭碗!") }
}
场景:安全性要求高的模块(如权限控制器)。
幽默解读:枚举单例就像你带着保镖吃饭,谁敢抢你的鸡腿,保镖直接把他扔出去![11]
终极对比表:选对模式,少走弯路
| 模式 | 线程安全 | 延迟加载 | 代码复杂度 | 适用场景 |
|---|---|---|---|---|
| 饿汉式 | ✅ | ❌ | ⭐ | 全局配置、轻量级工具类 |
| 懒汉式 | ✅ | ✅ | ⭐⭐⭐ | 数据库连接池、网络服务 |
| DCL | ✅ | ✅ | ⭐⭐⭐⭐ | 高频缓存、性能敏感模块 |
| 静态内部类 | ✅ | ✅ | ⭐⭐ | 文件解析、IO密集型服务 |
| 枚举单例 | ✅ | ❌ | ⭐ | 权限控制、高安全需求模块 |
总结:单例模式的“吃货哲学”
- 饿汉式:急性子,先占资源再说。
- 懒汉式:拖延症,但会锁门防抢。
- DCL:强迫症,追求完美流程。
- 静态内部类:藏饭高手,随叫随到。
- 枚举单例:VIP待遇,JVM保驾护航。
下次写代码时,记得根据场景选对“吃饭方式”,否则可能饿肚子(性能问题)或撑死(资源浪费)哦![11]
互动话题:你项目中用过哪种单例模式?踩过哪些坑?评论区见!👇
更多推荐


所有评论(0)