读经典做临床报名网站成品网站能用吗
2026/4/18 17:44:43 网站建设 项目流程
读经典做临床报名网站,成品网站能用吗,进销存十大软件,缤纷销客crm一、什么是单例模式#xff1f; 单例模式#xff08;Singleton Pattern#xff09;是一种创建型设计模式#xff0c;核心思想是#xff1a; 保证一个类在整个程序运行期间#xff0c;有且仅有一个实例#xff0c;并提供一个全局访问点来获取这个唯一实例。 核心特点 唯一…一、什么是单例模式单例模式Singleton Pattern是一种创建型设计模式核心思想是保证一个类在整个程序运行期间有且仅有一个实例并提供一个全局访问点来获取这个唯一实例。核心特点唯一实例类只能被实例化一次。全局访问提供一个静态方法让外部能方便地获取这个唯一实例。私有构造构造方法私有化禁止外部通过new关键字创建实例。适用场景配置类如数据库连接配置、系统配置日志类全局统一日志输出线程池、缓存、连接池等需要共享资源的场景二、单例模式的实现方式单例模式有多种实现方式各有优缺点下面是常见的几种1. 饿汉式Eager Initialization特点类加载时就创建实例线程安全但可能造成资源浪费如果实例一直没被使用。publicclassSingleton{// 类加载时就初始化privatestaticfinalSingletoninstancenewSingleton();// 私有构造privateSingleton(){}// 全局访问点publicstaticSingletongetInstance(){returninstance;}}2. 懒汉式Lazy Initialization特点第一次调用getInstance()时才创建实例节省资源但非线程安全。publicclassSingleton{privatestaticSingletoninstance;privateSingleton(){}publicstaticSingletongetInstance(){// 非线程安全多线程下可能创建多个实例if(instancenull){instancenewSingleton();}returninstance;}}3. 双重检查锁Double-Checked Locking特点结合了懒汉式的延迟加载和线程安全是最常用的高效实现方式。publicclassSingleton{// volatile 禁止指令重排保证多线程下的可见性privatestaticvolatileSingletoninstance;privateSingleton(){}publicstaticSingletongetInstance(){// 第一次检查避免每次都加锁提升性能if(instancenull){// 加锁保证同一时间只有一个线程进入synchronized(Singleton.class){// 第二次检查防止多个线程同时通过第一次检查后重复创建实例if(instancenull){instancenewSingleton();}}}returninstance;}}关键细节volatile关键字保证变量的可见性一个线程修改了instance其他线程能立即看到。禁止指令重排new Singleton()分为三步分配内存、初始化对象、引用赋值volatile防止这三步被重排避免多线程下获取到未初始化的实例。双重检查第一次检查快速判断避免每次都进入同步块提升性能。第二次检查在同步块内再次判断确保只创建一个实例。4. 静态内部类Static Inner Class特点利用类加载机制实现延迟加载和线程安全代码简洁推荐使用。publicclassSingleton{privateSingleton(){}// 静态内部类只有在被调用时才会加载实现延迟加载privatestaticclassSingletonHolder{privatestaticfinalSingletoninstancenewSingleton();}publicstaticSingletongetInstance(){returnSingletonHolder.instance;}}5. 枚举Enum特点最简洁、最安全的实现方式天然防止反射和序列化破坏单例推荐使用。publicenumSingleton{INSTANCE;// 唯一实例// 可以添加其他方法publicvoiddoSomething(){// 业务逻辑代码}}// 使用方式Singleton.INSTANCE.doSomething();三、单例模式的破坏与防护1. 反射破坏反射可以通过setAccessible(true)绕过私有构造创建多个实例。防护在构造方法中判断实例是否已存在若存在则抛出异常。privateSingleton(){if(instance!null){thrownewRuntimeException(单例模式禁止反射创建实例);}}使用枚举实现天然防止反射破坏。2. 序列化破坏如果单例类实现了Serializable接口反序列化时会创建新的实例。防护重写readResolve()方法返回单例实例。privateObjectreadResolve(){returninstance;}使用枚举实现天然防止序列化破坏。四、实现方式对比实现方式线程安全延迟加载性能推荐度饿汉式✅❌高⭐⭐⭐懒汉式❌✅低❌双重检查锁✅✅高⭐⭐⭐⭐静态内部类✅✅高⭐⭐⭐⭐⭐枚举✅✅高⭐⭐⭐⭐⭐最佳实践追求简洁和安全使用枚举。追求延迟加载和性能使用静态内部类或双重检查锁。五、总结单例模式的核心是保证类只有一个实例并提供全局访问点构造方法必须私有化。饿汉式线程安全但无延迟加载懒汉式有延迟加载但非线程安全双重检查锁和静态内部类兼顾了线程安全与延迟加载。枚举是最安全的单例实现方式能天然抵御反射和序列化破坏推荐优先使用。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询