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

广州小企业网站制作怎么在百度免费推广

广州小企业网站制作,怎么在百度免费推广,记事本做网站怎么调整图片间距,电脑网页浏览器引言:为什么需要单例模式 在软件开发中,某些对象只需要一个全局实例: 数据库连接池配置管理器日志记录器线程池缓存系统 使用new关键字多次创建这些对象会导致: #mermaid-svg-TyfdXbNvcmqwnA6C {font-family:"trebuchet m…

引言:为什么需要单例模式

在软件开发中,某些对象只需要一个全局实例

  • 数据库连接池
  • 配置管理器
  • 日志记录器
  • 线程池
  • 缓存系统

使用new关键字多次创建这些对象会导致:

多次创建
资源浪费
状态不一致
并发冲突

单例模式正是为解决这类问题而生的设计模式。它确保一个类只有一个实例,并提供全局访问点。本文将深入剖析单例模式的原理、实现及高级应用场景。


一、模式定义与核心思想

1.1 官方定义

单例模式 (Singleton Pattern):确保一个类只有一个实例,并提供一个全局访问点。

1.2 设计哲学

客户端
单例实例
客户端
客户端

核心原则

  1. 私有构造器:防止外部实例化
  2. 静态实例:全局唯一实例
  3. 全局访问点:提供获取实例的方法

二、单例模式实现方式大全

2.1 实现方案对比

实现方式线程安全延迟加载序列化安全反射安全复杂度
饿汉式★☆☆
懒汉式(非线程安全)★☆☆
同步方法★★☆
双重检查锁★★★
静态内部类★★☆
枚举★☆☆

2.2 饿汉式(Eager Initialization)

public class EagerSingleton {// 类加载时即初始化private static final EagerSingleton INSTANCE = new EagerSingleton();// 私有构造器private EagerSingleton() {}// 全局访问点public static EagerSingleton getInstance() {return INSTANCE;}
}

特点

  • 线程安全(JVM保证类加载的线程安全)
  • 不支持延迟加载
  • 简单直接

2.3 懒汉式(Lazy Initialization - 非线程安全)

public class UnsafeLazySingleton {private static UnsafeLazySingleton instance;private UnsafeLazySingleton() {}public static UnsafeLazySingleton getInstance() {if (instance == null) {instance = new UnsafeLazySingleton();}return instance;}
}

风险:多线程环境下可能创建多个实例

2.4 同步方法(Thread-Safe Lazy)

public class SynchronizedSingleton {private static SynchronizedSingleton instance;private SynchronizedSingleton() {}// 同步方法保证线程安全public static synchronized SynchronizedSingleton getInstance() {if (instance == null) {instance = new SynchronizedSingleton();}return instance;}
}

缺点:每次获取实例都需要同步,性能差

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

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防止指令重排序
  2. 两次判空减少同步开销

2.6 静态内部类(Initialization-on-demand Holder)

public class HolderSingleton {private HolderSingleton() {}// 静态内部类持有实例private static class SingletonHolder {static final HolderSingleton INSTANCE = new HolderSingleton();}public static HolderSingleton getInstance() {return SingletonHolder.INSTANCE;}
}

原理:利用类加载机制保证线程安全,实现延迟加载

2.7 枚举(Enum Singleton - 最佳实践)

public enum EnumSingleton {INSTANCE;// 业务方法public void businessMethod() {System.out.println("Singleton business logic");}
}

优势

  • 线程安全
  • 序列化安全
  • 反射安全
  • 简洁明了

三、单例模式进阶挑战

3.1 序列化与反序列化安全

public class SerializableSingleton implements Serializable {private static final long serialVersionUID = 1L;private static SerializableSingleton instance = new SerializableSingleton();private SerializableSingleton() {}public static SerializableSingleton getInstance() {return instance;}// 防止反序列化创建新实例protected Object readResolve() {return instance;}
}

3.2 反射攻击防护

public class ReflectionProofSingleton {private static ReflectionProofSingleton instance;private ReflectionProofSingleton() {// 防止反射创建实例if (instance != null) {throw new IllegalStateException("Singleton already initialized");}}public static synchronized ReflectionProofSingleton getInstance() {if (instance == null) {instance = new ReflectionProofSingleton();}return instance;}
}

3.3 克隆安全

public class CloneSafeSingleton implements Cloneable {private static CloneSafeSingleton instance = new CloneSafeSingleton();private CloneSafeSingleton() {}public static CloneSafeSingleton getInstance() {return instance;}@Overrideprotected Object clone() throws CloneNotSupportedException {throw new CloneNotSupportedException("Singleton cannot be cloned");}
}

四、多线程环境下的单例

4.1 性能对比测试

barCharttitle 单例模式性能对比(1000万次获取)x-axis 实现方式y-axis 时间(ms)series 耗时EagerSingleton: 32EnumSingleton: 35HolderSingleton: 38DCLSingleton: 45SynchronizedSingleton: 1200

4.2 单例与线程池

public class ThreadPoolSingleton {private static final int CORE_POOL_SIZE = 5;private static volatile ExecutorService instance;private ThreadPoolSingleton() {}public static ExecutorService getInstance() {if (instance == null) {synchronized (ThreadPoolSingleton.class) {if (instance == null) {instance = new ThreadPoolExecutor(CORE_POOL_SIZE,CORE_POOL_SIZE,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<>());}}}return instance;}
}

4.3 分布式环境挑战

服务A
Redis/ZooKeeper
服务B

解决方案

  1. 使用分布式锁实现全局单例
  2. 依赖外部存储维护状态

五、单例模式应用场景

5.1 典型应用场景

场景单例应用优势
配置管理全局配置读取统一配置源
日志系统日志记录器避免重复创建
数据库连接连接池管理资源复用
缓存系统全局缓存数据一致性
硬件接口设备控制避免冲突

5.2 使用时机判断

当满足以下条件时考虑单例模式:

  1. 类需要全局唯一实例
  2. 需要严格控制资源访问
  3. 需要共享状态或数据
  4. 需要频繁访问的对象

5.3 不适用场景

  1. 需要多实例的类
  2. 需要扩展的子类
  3. 测试驱动开发(难以模拟)
  4. 分布式系统(需特殊处理)

六、模式优劣辩证

6.1 优势 ✅

35% 25% 20% 15% 5% 单例模式优势 资源优化 状态一致性 全局访问 避免重复创建 减少内存占用

6.2 劣势 ❌

  1. 违反单一职责:兼具创建和管理功能
  2. 测试困难:难以模拟和替换
  3. 隐藏依赖:增加耦合度
  4. 并发挑战:需要额外处理线程安全
  5. 生命周期管理:何时销毁实例

七、单例模式与依赖注入

7.1 单例 vs 依赖注入容器

直接调用
注入
使用
传统单例
单例类
DI容器
客户端
单例Bean

7.2 Spring中的单例

@Service // Spring默认单例作用域
public class OrderService {// 业务逻辑
}@RestController
public class OrderController {private final OrderService orderService;// 通过构造器注入单例public OrderController(OrderService orderService) {this.orderService = orderService;}
}

7.3 最佳整合实践

public class DatabaseConnection {private static DatabaseConnection instance;private DatabaseConnection() {}public static DatabaseConnection getInstance() {if (instance == null) {synchronized (DatabaseConnection.class) {if (instance == null) {instance = new DatabaseConnection();}}}return instance;}// 注册到Spring容器@Beanpublic DatabaseConnection databaseConnection() {return DatabaseConnection.getInstance();}
}

八、在开源框架中的应用

8.1 Java Runtime类

public class Runtime {private static Runtime currentRuntime = new Runtime();public static Runtime getRuntime() {return currentRuntime;}private Runtime() {}
}

8.2 Log4j2 LoggerContext

public class LoggerContext {private static LoggerContext context;public static LoggerContext getContext() {if (context == null) {synchronized (LoggerContext.class) {if (context == null) {context = new LoggerContext();}}}return context;}
}

8.3 Spring ApplicationContext

public class AnnotationConfigApplicationContext {// 虽然不是严格单例,但通常作为单例使用
}// 典型使用方式
@SpringBootApplication
public class MyApp {public static void main(String[] args) {// 创建单例ApplicationContextApplicationContext context = SpringApplication.run(MyApp.class, args);}
}

九、单例模式反模式与陷阱

9.1 常见错误实现

// 反例1:public字段暴露
public class PublicFieldSingleton {public static final PublicFieldSingleton INSTANCE = new PublicFieldSingleton();private PublicFieldSingleton() {}
}// 反例2:静态块未处理异常
public class StaticBlockSingleton {private static StaticBlockSingleton instance;static {try {instance = new StaticBlockSingleton();} catch (Exception e) {// 未处理异常}}private StaticBlockSingleton() {}public static StaticBlockSingleton getInstance() {return instance;}
}

9.2 单例滥用案例

// 反例:将业务服务设计为单例
public class UserService {private static UserService instance;private UserService() {}// 单例访问点public static synchronized UserService getInstance() {if (instance == null) {instance = new UserService();}return instance;}// 业务方法public void registerUser(User user) {// ...}
}

问题

  1. 难以扩展
  2. 无法模拟测试
  3. 状态污染风险

十、最佳实践指南

10.1 实现选择建议

需要单例
需要延迟加载
需要序列化/反射安全
枚举实现
性能敏感
双重检查锁
静态内部类
需要序列化/反射安全
饿汉式

10.2 线程安全实践

  1. 优先使用不可变状态

    public class ImmutableSingleton {private final Map<String, String> config;private ImmutableSingleton() {// 初始化后不再修改config = loadConfigFromFile();}public String getConfig(String key) {return config.get(key);}
    }
    
  2. 使用ThreadLocal实现线程单例

    public class ThreadLocalSingleton {private static final ThreadLocal<ThreadLocalSingleton> instance = ThreadLocal.withInitial(ThreadLocalSingleton::new);private ThreadLocalSingleton() {}public static ThreadLocalSingleton getInstance() {return instance.get();}
    }
    

10.3 测试策略

public class DatabaseConnection {private static DatabaseConnection instance;// 测试钩子static void setTestInstance(DatabaseConnection testInstance) {instance = testInstance;}// 重置为生产实例static void reset() {instance = null;}
}// 测试类
class DatabaseConnectionTest {@AfterEachvoid tearDown() {DatabaseConnection.reset();}@Testvoid testSingleton() {DatabaseConnection.setTestInstance(mock(DatabaseConnection.class));// 执行测试}
}

十一、总结:单例模式的核心价值

单例模式通过全局唯一实例实现了:

资源优化
提高性能
状态一致性
保证数据准确
全局访问
简化调用

设计启示
单例不是银弹,而是特定场景下的精密工具 - 用对场景比实现更重要

正如《设计模式》作者GoF所强调:

“单例模式确保一个类仅有一个实例,并提供一个访问它的全局访问点。这个模式在需要控制资源或者协调操作时特别有用”


扩展思考

  1. 如何在微服务架构中实现全局单例?
  2. 单例模式如何与反应式编程结合?
  3. 单例对象的内存泄漏如何预防?

附录:单例模式快速参考卡

场景推荐实现注意事项
简单应用枚举单例最佳实践首选
延迟加载静态内部类简洁安全
高性能要求双重检查锁需加volatile
线程隔离ThreadLocal非全局单例
Spring环境@Bean单例利用容器管理

单例模式是构建高效、一致系统的关键工具,在资源管理、配置控制等场景中具有不可替代的价值

http://www.dtcms.com/wzjs/85895.html

相关文章:

  • 泉州做网站优化价格市场营销推广活动方案
  • 天津工程建设协会网站安顺seo
  • 做网站的公司如何运营产品营销策划方案
  • 网站开发后端用什么爱站网关键词查询网站的工具
  • 搭建网站代码网络营销专业介绍
  • 网页效果制作优化大师官网登录入口
  • 不喜欢做政府网站运营seo教程 百度网盘
  • 专门做音乐的网站今日要闻
  • 搭建源码下载站网站成都seo工程师
  • 各类网站推广最新新闻事件今天疫情
  • 禁用wordpress自动保存的插件郑州网络seo公司
  • 如何用kali做网站渗透志鸿优化网下载
  • 电子商务平台 网站 建设方式重庆网络seo公司
  • 网站怎么ftp韩国最新新闻
  • 重庆市城乡住房和建设信息网aso关键字优化
  • 广西公司做网站简单的html网页制作
  • 网站表单怎么做百度合伙人官网app
  • 广西建设培训中心网站什么是网络营销
  • 东莞品牌网站建设源码交易网站源码
  • 安徽网站建设科技今日新闻热点大事件
  • 个人网站的作用今天头条新闻
  • 外贸营销网站建设工程哈尔滨百度网络推广
  • 做网站需要向客户了解什么市场调研方法有哪些
  • 天猫网站做链接怎么做青岛网站建设优化
  • 制作网站开发公司网络销售好不好做
  • 小程序外包商丘seo博客
  • 网站内容收录常用的seo网站优化排名
  • 企业网站优化公司有哪些淘宝seo培训
  • 学做网站需要多长时间京东关键词优化技巧
  • 河南建设资格执业网站以营销推广为主题的方案