从‘通道里藏像素’到高清图:拆解PixelShuffle论文里的核心思想与PyTorch实现细节
2026/6/10 5:56:31
在 Java 面试中,单例模式几乎是必问内容。虽然看似简单,但不同实现方式的线程安全、性能以及是否能抵御反射与序列化攻击,都存在巨大的差异。
这次,卷卷就来将单例模式常见的五种实现方式进行整理和对比,适合用于学习、复习以及面试答题。
类加载时就创建单例对象,无需加锁,线程安全。
实例非常轻量,或者确定一定会使用的单例场景。
实例在第一次访问时创建。
通过 synchronized 或 DCL 实现线程安全版本。
懒汉式直接加锁效率太低,每次获取实例都要锁一次。
实例引用必须加上volatile,否则可能出现指令重排导致拿到未初始化完成的对象。
利用类加载机制实现懒加载与线程安全。
内部类不会随外部类加载,只有调用getInstance()时才加载内部类并创建实例。
publicclassSingleton{privateSingleton(){}privatestaticclassHolder{privatestaticfinalSingletonINSTANCE=newSingleton();}publicstaticSingletongetInstance(){returnHolder.INSTANCE;}}利用枚举类型实现单例,是 Java 中唯一完全防御:
的单例写法。
publicenumSingleton{INSTANCE;}| 实现方式 | 是否懒加载 | 是否线程安全 | 是否安全抵御反射/序列化 | 性能 |
|---|---|---|---|---|
| 饿汉式 | 否 | 是 | 否 | 高 |
| 懒汉式(未加锁) | 是 | 否 | 否 | 高 |
| 懒汉式 synchronized | 是 | 是 | 否 | 低 |
| DCL | 是 | 是(需 volatile) | 否 | 高 |
| 静态内部类 | 是 | 是 | 否 | 很高(推荐) |
| 枚举单例 | 否 | 是 | 是(唯一) | 很高 |
如果在面试中被问到“你更推荐哪种单例模式?”
可以这样回答:
我更推荐使用静态内部类方式,因为它结合了懒加载、线程安全以及高性能的所有优点,写法简洁且稳定。
如果对安全性要求极高(防止反射、反序列化),那枚举单例是最稳妥的选择。
饿汉式太着急,懒汉式太磨叽,DCL 看着帅但少个 volatile 就寄;
静态内部类不声不响地最稳,枚举更离谱:
反射打不过它,序列化打不过它,我也打不过它。
总之就是一句话:
单例不难,难的是理解单例为什么不难。
今天的脑细胞库存-1,知识储备+1,算是赚了。