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

设计师资源网站网上如何申请注册公司

设计师资源网站,网上如何申请注册公司,网站开发找哪家,出售友情链接是什么意思单例模式:深入解析全局唯一对象的艺术 引言:为什么需要单例? 在软件设计中,某些对象只需要一个全局实例——配置文件管理器、线程池、数据库连接池、日志系统等。创建多个实例不仅浪费资源,还可能导致状态不一致。单例…

单例模式:深入解析全局唯一对象的艺术

引言:为什么需要单例?

在软件设计中,某些对象只需要一个全局实例——配置文件管理器、线程池、数据库连接池、日志系统等。创建多个实例不仅浪费资源,还可能导致状态不一致。单例模式(Singleton Pattern)正是为解决这类问题而生的创建型设计模式,它确保一个类仅有一个实例,并提供全局访问点。


一、单例模式的核心思想

三大核心要素

  1. 私有化构造函数
    防止外部通过new创建实例
  2. 静态私有成员变量
    持有类的唯一实例
  3. 静态公有访问方法
    提供全局访问入口(通常命名为getInstance()

UML 类图

Singleton
- static instance: Singleton
-Singleton()
+static getInstance()

二、单例模式的 5 种经典实现

1. 饿汉式(Eager Initialization)

public class EagerSingleton {// 类加载时立即初始化private static final EagerSingleton instance = new EagerSingleton();private EagerSingleton() {}public static EagerSingleton getInstance() {return instance;}
}

特点

  • ✅ 线程安全(由JVM类加载机制保证)
  • ❌ 可能造成资源浪费(未使用即加载)

2. 懒汉式(Lazy Initialization)

基础版(线程不安全)
public class LazySingleton {private static LazySingleton instance;private LazySingleton() {}public static LazySingleton getInstance() {if (instance == null) {instance = new LazySingleton(); // 多线程下可能创建多个实例}return instance;}
}
同步方法版(线程安全但低效)
public synchronized static LazySingleton getInstance() {if (instance == null) {instance = new LazySingleton();}return instance;
}

缺点:每次访问都加锁,性能差

双重检查锁(DCL - Double-Checked Locking)
public class DCLSingleton {private volatile static DCLSingleton instance; // volatile 禁止指令重排序private DCLSingleton() {}public static DCLSingleton getInstance() {if (instance == null) {                    // 第一次检查synchronized (DCLSingleton.class) {    // 加锁if (instance == null) {            // 第二次检查instance = new DCLSingleton(); // 初始化}}}return instance;}
}

关键点

  • volatile 防止JVM指令重排序导致的未初始化完成对象被引用
  • 两次判空避免重复加锁

3. 静态内部类(Holder Pattern)

public class HolderSingleton {private HolderSingleton() {}private static class SingletonHolder {private static final HolderSingleton INSTANCE = new HolderSingleton();}public static HolderSingleton getInstance() {return SingletonHolder.INSTANCE; // 触发类加载}
}

原理
利用JVM的类加载机制保证线程安全
静态内部类在首次调用getInstance()时才加载,实现延迟初始化

4. 枚举实现(Effective Java 推荐)

public enum EnumSingleton {INSTANCE; // 单例实例public void doSomething() {System.out.println("Singleton method");}
}

优势

  • ✅ 绝对防止反射攻击
  • ✅ 自动支持序列化
  • ✅ 代码最简洁
  • ✅ 线程安全

三、单例模式的典型应用场景

  1. 配置管理类
    全局共享的配置信息(如ConfigManager
  2. 日志系统
    统一收集日志的Logger对象
  3. 线程池/连接池
    池化技术需要统一管理资源
  4. 缓存系统
    全局缓存对象(如Redis客户端连接)
  5. 硬件接口访问
    打印机、显卡驱动等独占资源

四、单例模式的潜在缺陷

1. 多线程环境问题

  • 竞态条件(Race Condition)
  • 可见性问题(未使用volatile

2. 反射攻击解决方案

private Singleton() {if (instance != null) {throw new IllegalStateException("Singleton already initialized");}
}

3. 序列化破坏单例

需添加readResolve()方法:

protected Object readResolve() {return getInstance();
}

4. 单元测试困难

  • 单例状态全局共享导致测试相互影响
  • 解决方案:依赖注入或重置机制

五、单例模式在框架中的应用

Spring 框架中的单例

@Service // 默认单例作用域
public class UserServiceImpl implements UserService {// 业务代码
}

特点

  • Bean默认单例(通过IoC容器管理)
  • 非传统单例(可通过多个容器创建不同实例)

Java 标准库案例

Runtime runtime = Runtime.getRuntime(); // 饿汉式实现
Desktop desktop = Desktop.getDesktop(); 

六、单例模式 vs 静态类

特性单例模式静态类
实现方式对象实例静态方法
接口实现✅ 可实现接口❌ 不能
继承✅ 可继承父类❌ 不能
延迟初始化✅ 支持❌ 类加载即初始化
状态管理✅ 可维护状态❌ 无状态

七、单例模式的最佳实践

  1. 优先选择枚举实现
    《Effective Java》第一条款推荐
  2. 需要延迟加载时用静态内部类
    兼顾线程安全和性能
  3. 避免全局状态污染
    谨慎使用单例存储可变数据
  4. 考虑依赖注入替代
    在Spring等框架中优先使用IoC管理

八、经典面试题解析

Q1:DCL为什么要用volatile?

private volatile static Singleton instance;

答案
防止指令重排序。对象初始化分为三步:

  1. 分配内存空间
  2. 初始化对象
  3. 将引用指向内存地址
    若步骤2、3重排序,其他线程可能拿到未初始化的对象。

Q2:如何防止克隆破坏单例?

@Override
protected Object clone() throws CloneNotSupportedException {throw new CloneNotSupportedException("Singleton cannot be cloned");
}

总结:单例模式的哲学

单例模式通过控制实例化过程,在保证全局唯一性的同时提供了灵活性。其价值不仅在于技术实现,更体现了资源治理边界控制的设计思想。随着云原生和微服务架构兴起,单例的应用场景正在向“单例作用域”(如Kubernetes Pod内的单例)演进,但其核心设计理念永不褪色。

最后提醒: 不要为了用单例而用单例!当你的需求符合“系统中有且只需一个全局对象”时,再考虑它。


文章转载自:

http://0OF8U9Jt.pqcbx.cn
http://RJWblDzs.pqcbx.cn
http://hE24Sxlb.pqcbx.cn
http://N1yQ1yuv.pqcbx.cn
http://M00rT2Ud.pqcbx.cn
http://e3lw1PDt.pqcbx.cn
http://y6YX4QmU.pqcbx.cn
http://O0eqUgT7.pqcbx.cn
http://CYp9zGhO.pqcbx.cn
http://RiUoHLOS.pqcbx.cn
http://Wv5cm0tI.pqcbx.cn
http://OV5MaTy0.pqcbx.cn
http://reJvKaaa.pqcbx.cn
http://C3jhfWUD.pqcbx.cn
http://5iWvnnhx.pqcbx.cn
http://UgVmJxVU.pqcbx.cn
http://kv6NyQLY.pqcbx.cn
http://AT48A9bH.pqcbx.cn
http://i5oMA0KD.pqcbx.cn
http://9yEyP7cl.pqcbx.cn
http://G1bCb49J.pqcbx.cn
http://pgiBY0fk.pqcbx.cn
http://YXQT3TnF.pqcbx.cn
http://1JHJFhfP.pqcbx.cn
http://d6pVxm7V.pqcbx.cn
http://KlUqPOl0.pqcbx.cn
http://k45XthcP.pqcbx.cn
http://kfNacmfO.pqcbx.cn
http://ZL2QK3Tm.pqcbx.cn
http://6scOBnj8.pqcbx.cn
http://www.dtcms.com/wzjs/698687.html

相关文章:

  • 电子商务网站的建设目标是什么福田欧曼est
  • 深圳商城网站设计价格百度广告点击一次多少钱
  • 潍坊做网站建设p2p网站开发费用
  • 昆明著名网站建设公司内部网站页面设计
  • 百度验证网站所有权百度申请qq号免费注册官网
  • 自己有网站怎么优化制作一个响应式网站开发工具
  • 购物网站开发所用技术如何自己做app
  • 金华市建设银行网站对网站开发流程的认识
  • 上海企业建站公司排名个人网站制作源代码
  • 江门网站建设兼职网站建设中html5源码
  • 建站工具原理电子商务网站模板免费下载
  • zhihu网站建设响应式中文网站模板
  • 建设银行信用卡网站是哪个好有没有什么网站做泰国的东西
  • ps里面怎么做网站对联广告网络推广方案
  • 网站运营技巧wordpress 开发指南
  • 谷歌网站入口合肥市公司网站建设
  • 做网站怎么维护短网址转换器
  • 湖北建设科技中心网站首页网站开发实训新的体会
  • 国内做的比较简洁的网站做家教需要什么哪个网站的会员
  • 外贸网站源码phpwordpress 获取目录结构
  • 网站建设如何搭建框架在网上做试卷的网站
  • 山东振国网站建设怎么做点击图片进网站
  • 罗湖商城网站建设哪家公司便宜点企业网站优化电话
  • 旌阳移动网站建设wordpress 小米官网主题
  • 德州有做网站的广州定制型网站
  • 做教育类网站一般流程高端网站定制开发
  • 如何自己开发微网站wordpress导航栏插件
  • 商品网站建设实验记录wordpress eshop
  • 网站设计与制作报价网站备案 是域名还是空间
  • 网站开发方面知识wordpress关闭主循环