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

Java单列模式总结及实现

以下是Java单例模式的全面解析及主流实现方式:

一、单例模式核心特性

  1. 唯一实例‌:确保类只有一个实例对象
  2. 私有构造‌:禁止外部通过new创建实例
  3. 全局访问点‌:提供static方法获取唯一实例
  4. 典型应用‌:配置管理、线程池、日志系统等需全局唯一访问的场景

二、8种主流实现方式对比

1. 饿汉式(静态常量) 

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

  • 特点‌:线程安全但可能浪费内存
2. 懒汉式(线程不安全版)
public class Singleton {private static Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {instance = new Singleton(); // 多线程下可能创建多个实例}return instance;}
}
  • 风险‌:需配合synchronized解决线程安全问题
3. 双重检查锁(DCL)
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;
    }
}
 
  • 关键点‌:volatile防止指令重排序
4. 静态内部类
public class Singleton {private Singleton() {}private static class Holder {static final Singleton INSTANCE = new Singleton();}public static Singleton getInstance() {return Holder.INSTANCE;}
}
  • 优势‌:懒加载+线程安全+无锁高性能
5. 枚举单例(Effective Java推荐)

public enum Singleton {
    INSTANCE;
    public void doSomething() { /* 业务方法 */ }
}

  • 最佳实践‌:防反射攻击、序列化安全

三、Spring框架中的单例实践

  • 容器级单例‌:Spring默认使用ConcurrentHashMap管理单例Bean
  • 与原生单例区别‌:Spring单例是IOC容器范围内唯一,而非JVM级

四、选型建议

实现方式线程安全懒加载防反射适用场景
饿汉式✔️初始化耗时不敏感的场景
双重检查锁✔️✔️高并发且需延迟初始化
枚举✔️✔️需要绝对安全的场景
静态内部类✔️✔️主流推荐方案

最新趋势‌:枚举单例因其安全性成为企业级开发首选,而Kotlin的object语法进一步简化了单例实现。实际开发中应结合性能需求和安全要求选择方案。

http://www.xdnf.cn/news/972541.html

相关文章:

  • asio之读写
  • 路径规划算法概论:从理论到实践
  • switch选择语句
  • ABB UNITROL 6000 X-power 3BH022294R0103 GFD233A103
  • Python 3.6/3.8版本切换脚本
  • 调用支付宝接口响应40004 SYSTEM_ERROR问题排查
  • Python模块全解析:从入门到精通
  • MySQL学习之---索引
  • Lighttpd 配置选项介绍
  • 谷歌趋势自动报告系统(Pipedream + Scrapeless + Discord)
  • 电脑一段时间没用就变成登陆的界面
  • 5G+边缘计算推动下的商品详情API低延迟高效率新方案
  • 【Linux Learning】SSH连线出现警告:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
  • 超火的开源项目(Github热点)
  • 交叉编译笔记
  • Docker部署Nginx-UI
  • 【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
  • 安装 PyCharm
  • Open3D 点云处理笔记
  • 城市照明深夜全亮太浪费?智能分时调光方案落地贵州某市
  • threadlocal的实现说明
  • python46
  • 端到端自动驾驶研究:通过强化学习与世界模型的协同作用向VLA范式演进
  • 曼昆《经济学原理》第九版 第十三章生产成本
  • 智能呼入系统助力酒店客服服务
  • 使用mpu6500/6050, PID,互补滤波实现一个简单的飞行自稳控制系统
  • 2025.6.10【ZR NOI模拟赛 T3】 过啥题 题解(Lucas 定理, 数位dp, 组合意义)
  • Java设计模式基础问答
  • 通过Wrangler CLI在worker中创建数据库和表
  • QFuture的使用方式