下图为所有设计模式,带标记为重点掌握以及工作中常用到的:
单例模式共分为三种方式、饿汉式、懒汉式、枚举方式等,每种方式都有各自的特点:
| 方式 | 优点 | 缺点 | 是否推荐 | 使用场景 |
| 饿汉式 | 无线程安全问题 | 可能造成内存浪费、无懒加载效应 | 推荐 | 源码Runtime类中使用了饿汉式 |
| 懒汉式 | 懒加载 | 有线程安全问题 | 推荐 | |
| 枚举方式 | 简单、无线程安全问题 | 推荐 |
饿汉式实现方式:
//方式一 静态常量方式
public class Singleton {
// 构造方法私有化
private Singleton() {
}
// 对象私有化
private static final Singleton singleton = new Singleton();
public static Singleton getSingleton() {
return singleton;
}
}
//方式二 静态块方式
class SingletonX {
// 构造方法私有化
private SingletonX() {
}
// 对象私有化
private static SingletonX singleton ;
static {
singleton = new SingletonX();
}
public static SingletonX getSingleton() {
return singleton;
}
}
懒汉式实现方式:
// 双重检查锁定
public class Singleton {
// 私有构造器,防止外界实例化
private Singleton() {}
// volatile关键字确保多线程环境下的可见性和有序性
private volatile static Singleton instance;
// 双重检查锁定,确保单例且懒加载
public static Singleton getInstance() {
if (instance == null) { // 第一次检查
synchronized (Singleton.class) {
if (instance == null) { // 第二次检查
instance = new Singleton();
}
}
}
return instance;
}
// 序列化时防止重新生成新实例
protected Object readResolve() {
return instance;
}
}
// 静态内部类
public class Singleton2 {
// 构造方法私有化
private Singleton2() {
}
// 通过静态类创建对象
private static class SingletFactory {
private static final Singleton2 INSTANCE = new Singleton2();
}
public static Singleton2 getSingleton() {
return SingletFactory.INSTANCE;
}
}
枚举方式:
public enum Singleton3 {
INSTANCE;
}
以上几种方式,都算是比较完美的,项目中可以正常使用,懒汉式采用静态内部类的方式解决了线程安全的问题以及懒加载等,还有其余几种懒汉式的方式,比如双重锁等方式,个人不推荐,最推荐的方式是使用枚举。
本文深入解析单例模式的三种实现方式:饿汉式、懒汉式及枚举方式,对比其优缺点,并推荐最佳实践。饿汉式实现简单,但可能造成内存浪费;懒汉式支持懒加载,但需注意线程安全;枚举方式简洁且天然线程安全。

885

被折叠的 条评论
为什么被折叠?



