前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java一分钟之-设计模式:单例模式的实现

Java一分钟之-设计模式:单例模式的实现

作者头像
Jimaks
发布2024-05-19 07:55:11
1070
发布2024-05-19 07:55:11
举报
文章被收录于专栏:大数据面试大数据面试

单例模式是一种常见的设计模式,用于确保一个类只有一个实例,并提供全局访问点。本文将介绍单例模式的几种实现方式,以及相关的常见问题、易错点和如何避免它们。

1. 饿汉式(Static Singleton)

在类加载时就创建实例,线程安全,但可能导致不必要的资源浪费。

代码语言:javascript
复制
public class Singleton {
    private static final Singleton INSTANCE = new Singleton();

    private Singleton() {}

    public static Singleton getInstance() {
        return INSTANCE;
    }
}

2. 懒汉式(DCL,Double-Checked Locking)

延迟初始化,只有在首次使用时才创建实例。使用volatile关键字保证可见性和有序性。

代码语言:javascript
复制
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. 静态内部类(Thread-safe Lazy Initialization)

利用类加载机制保证线程安全,延迟初始化。

代码语言:javascript
复制
public class Singleton {
    private Singleton() {}

    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

4. 枚举单例

最简洁、安全的实现方式,天然线程安全,防止反射攻击。

代码语言:javascript
复制
public enum Singleton {
    INSTANCE;
}

5. 常见问题与解决

5.1 反射攻击

通过反射创建新的实例,绕过单例约束。枚举单例可以防止这种情况。

代码语言:javascript
复制
Singleton singleton = Singleton.class.getDeclaredConstructor().newInstance();

5.2 序列化与反序列化

单例对象被序列化和反序列化时,可能会创建多个实例。在单例类上实现readResolve()方法来返回已存在的实例。

代码语言:javascript
复制
private Object readResolve() {
    return INSTANCE;
}

5.3 单例的生命周期

单例的生命周期与应用相同,如果需要在特定条件下销毁,需要额外处理。

6. 易错点与避免方法

6.1 避免在静态初始化器中创建实例

静态初始化器在类加载时执行,可能导致不必要的实例化。

6.2 注意线程安全

在多线程环境中,确保单例的创建是线程安全的。

6.3 考虑可测试性

设计单例时,考虑测试需求,如提供构造函数的友元访问。

7. 结语

单例模式在许多场景下都非常有用,但使用时需谨慎,避免滥用。理解各种实现方式及其优缺点,根据项目需求选择合适的方法。同时,注意单例的生命周期、线程安全和测试性,以确保代码的质量和可维护性。


掌握单例模式的实现方式,有助于你在实际项目中更好地组织代码和管理资源。不断学习和实践,将使你的设计更加优雅和高效。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-05-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2. 懒汉式(DCL,Double-Checked Locking)
  • 3. 静态内部类(Thread-safe Lazy Initialization)
  • 4. 枚举单例
  • 5. 常见问题与解决
    • 5.1 反射攻击
      • 5.2 序列化与反序列化
        • 5.3 单例的生命周期
        • 6. 易错点与避免方法
          • 6.1 避免在静态初始化器中创建实例
            • 6.2 注意线程安全
              • 6.3 考虑可测试性
              • 7. 结语
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档