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

泉州做网站的公司淄博中企动力

泉州做网站的公司,淄博中企动力,昆山企业网站设计,做网站有哪些注意事项Java单例模式终极指南:从原理到防御性编程 目录 单例模式的核心思想五大经典实现方式 2.1 饿汉式(Eager Initialization)2.2 懒汉式(Lazy Initialization)2.3 双重检查锁(Double-Checked Locking&#xf…

Java单例模式终极指南:从原理到防御性编程

目录

  1. 单例模式的核心思想
  2. 五大经典实现方式
    • 2.1 饿汉式(Eager Initialization)
    • 2.2 懒汉式(Lazy Initialization)
    • 2.3 双重检查锁(Double-Checked Locking)
    • 2.4 静态内部类(Static Inner Class)
    • 2.5 枚举(Enum)
  3. 进阶:防御反射与序列化攻击
  4. 性能对比与选型建议
  5. 应用场景与实战案例
  6. 高频面试题剖析

1. 单例模式的核心思想

1.1 定义

确保一个类仅有一个实例,并提供该实例的全局访问点

1.2 三大核心要素

  1. 私有化构造器:禁止外部通过new创建实例
  2. 静态私有实例:持有唯一实例的引用
  3. 静态公有方法:提供全局访问入口

1.3 设计价值

  • 资源控制:如数据库连接池
  • 配置管理:全局唯一配置中心
  • 日志记录:避免日志写入冲突

2. 五大经典实现方式

2.1 饿汉式(Eager Initialization)

实现原理

类加载时立即初始化实例,利用类加载机制保证线程安全。

public class EagerSingleton {// 1. 静态私有实例(类加载时初始化)private static final EagerSingleton INSTANCE = new EagerSingleton();// 2. 私有构造器private EagerSingleton() {}// 3. 全局访问点public static EagerSingleton getInstance() {return INSTANCE;}
}
特点分析
维度说明
线程安全✅ 类加载机制保证
资源占用❌ 可能造成资源浪费
反射防御❌ 无法阻止反射攻击

2.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 class SyncLazySingleton {private static SyncLazySingleton instance;private SyncLazySingleton() {}// 方法级同步锁,性能差public static synchronized SyncLazySingleton getInstance() {if (instance == null) {instance = new SyncLazySingleton();}return instance;}
}
特点分析
版本线程安全性能适用场景
基础版⚡️ 极高单线程环境
同步锁版🐢 低效低并发场景

2.3 双重检查锁(Double-Checked Locking)

最佳实践(JDK5+)
public class DCLSingleton {// volatile禁止指令重排序private static volatile DCLSingleton instance;private DCLSingleton() {}public static DCLSingleton getInstance() {if (instance == null) {                    // 第一次检查synchronized (DCLSingleton.class) {    // 加锁if (instance == null) {             // 第二次检查instance = new DCLSingleton();}}}return instance;}
}
关键技术点
  1. volatile关键字

    • 防止JVM指令重排序(避免返回未初始化的对象)
    • 保证内存可见性(多线程环境下实例状态一致)
  2. 双重判空逻辑

    • 外层检查:避免每次访问都加锁
    • 内层检查:防止多个线程同时通过外层检查

2.4 静态内部类(Static Inner Class)

实现原理

利用类加载机制的延迟初始化特性,实现线程安全的懒加载。

public class InnerClassSingleton {private InnerClassSingleton() {}// 静态内部类持有实例private static class Holder {static final InnerClassSingleton INSTANCE = new InnerClassSingleton();}public static InnerClassSingleton getInstance() {return Holder.INSTANCE;}
}
优势分析
  • 懒加载:只有调用getInstance()时才会加载Holder
  • 线程安全:由类加载器保证
  • ⚡️ 高性能:无锁竞争

2.5 枚举(Enum)

《Effective Java》推荐方案
public enum EnumSingleton {INSTANCE;// 添加业务方法public void doSomething() {System.out.println("枚举单例执行操作");}
}
// 调用:EnumSingleton.INSTANCE.doSomething();
核心优势
  1. 绝对防止反射攻击
    • JVM禁止通过反射创建枚举实例
  2. 自动处理序列化
    • 枚举实例反序列化时不会生成新对象
  3. 代码极简
    • 天然支持单例特性,无需额外代码

3. 进阶:防御反射与序列化攻击

3.1 反射防御方案

通过构造器中抛出异常,阻止反射调用。

private DCLSingleton() {if (instance != null) {throw new RuntimeException("禁止反射破坏单例!");}
}

3.2 序列化防御方案

实现readResolve()方法,指定反序列化时返回现有实例。

public class SerializableSingleton implements Serializable {private static final long serialVersionUID = 1L;private static SerializableSingleton instance = new SerializableSingleton();private SerializableSingleton() {}// 关键方法:反序列化时返回已有实例private Object readResolve() {return instance;}
}

4. 性能对比与选型建议

实现方式线程安全懒加载防反射防序列化性能
饿汉式⚡️ 高
双重检查锁⚡️ 高
静态内部类⚡️ 高
枚举⚡️ 高

选型建议

  • 简单场景:枚举(优先)或饿汉式
  • 延迟加载:静态内部类
  • 旧版本JDK:双重检查锁

5. 应用场景与实战案例

5.1 经典应用场景

  1. 配置管理器
    public class ConfigManager {private static ConfigManager instance;private Properties configs;private ConfigManager() {// 加载配置文件}public static ConfigManager getInstance() { ... }
    }
    
  2. 线程池管理
  3. 日志记录器

5.2 Spring框架中的单例

  • Bean作用域:默认单例(通过IoC容器管理)
  • 实现差异:非传统单例模式,依赖容器控制生命周期

6. 高频面试题剖析

6.1 为什么枚举单例是最佳实践?

  • 天然防御反射和序列化攻击
  • 代码简洁,JVM层支持

6.2 双重检查锁为何需要volatile?

  • 防止指令重排序导致的部分初始化对象问题
  • 保证多线程环境下的可见性

6.3 如何实现线程安全且高效的懒加载?

  • 优先选择:静态内部类(无锁)或枚举
  • 次优选择:双重检查锁+volatile

---**注**:本文代码示例基于JDK 17,反射防御代码需根据具体实现调整。枚举单例是《Effective Java》作者Joshua Bloch强烈推荐的方式。

文章转载自:

http://iBNNIzq1.ymmjx.cn
http://dkBg2DwV.ymmjx.cn
http://isP6Xk86.ymmjx.cn
http://axgehXHe.ymmjx.cn
http://FCuIOWh2.ymmjx.cn
http://8xOJds1K.ymmjx.cn
http://De0FBLNE.ymmjx.cn
http://og1xvujX.ymmjx.cn
http://st0CAH6x.ymmjx.cn
http://wT1kQimS.ymmjx.cn
http://1ZufW5Xh.ymmjx.cn
http://oIqUJLNK.ymmjx.cn
http://tp8ZoZC1.ymmjx.cn
http://4HxgDGEp.ymmjx.cn
http://5W2KvIIO.ymmjx.cn
http://F6mEqmwn.ymmjx.cn
http://94Q8HRaw.ymmjx.cn
http://uPs0OPYS.ymmjx.cn
http://uTzQv1Ay.ymmjx.cn
http://yCUwfO0u.ymmjx.cn
http://XheYZNZ3.ymmjx.cn
http://UMo2uZWf.ymmjx.cn
http://9LtpDg7k.ymmjx.cn
http://1VhfT7K8.ymmjx.cn
http://wvZ8ia8x.ymmjx.cn
http://eg6HklPB.ymmjx.cn
http://AZzICmpb.ymmjx.cn
http://W5z5pThK.ymmjx.cn
http://4OSd4d82.ymmjx.cn
http://pDroxMWr.ymmjx.cn
http://www.dtcms.com/wzjs/619234.html

相关文章:

  • 三亚网站优化制作公司网页流程费用
  • 做网站和做系统有什么区别2狠狠做网站
  • 最新网站开发语言高端网站开放
  • 社交网站 源码广州seo技术培训
  • 青岛做网站建设多少钱网站生成系统
  • 网站建设的方法有哪些内容知名企业网站截图
  • 凡科建站官网需要什么网站编辑做的准备
  • 企业站手机网站好网站建设公司开发方案
  • 网站两边广告代码wordpress注册不成功
  • html网站地图在线生成外贸订单一般在哪个平台接?
  • 从零做网站模板网件路由器重置
  • 辽宁网站建设fengyan十大社交电商购物平台
  • 这样建立自己的网站怎么自己制作图片
  • 沧州网站设计师招聘用什么做网站后台的
  • 陕西省城乡建设厅官方网站物流网站免费源码
  • 网站组成河北省城乡住房和建设厅网站
  • 网站主机英文有自己的域名怎么建设网站
  • 邯郸网站设计培训班wordpress移动底部菜单插件
  • 深圳全网营销型网站做宴会网站
  • 前端角度实现网站首页加载慢优化儿童网站欣赏
  • wordpress分类目录网站主题平台推广员是干嘛的
  • 西宁网站搭建企业wordpress喜欢_赏_分享
  • 培训网站建设方案模板下载电子商务平台官网入口
  • 网站制作多少钱新闻做网站可能遇到的问题
  • 哈尔滨市工程建设信息网windows优化大师使用方法
  • 深圳场站建设发展有限公司铜川网站建设公司电话
  • 现在哪个网站还做白拿运城做网站费用高吗
  • 孝感网站开发公司门户网站建设主要内容
  • 专业网站定制设计公司南昌网站建设招聘
  • 网站建设属什么资产桥头东莞网站建设