96SEO 2026-02-19 23:30 12
。

这种类型的设计模式属于创建者模式#xff0c;它提供了一种访问对象的最佳方式。
这种设计模式涉及到一个单一的类#xff0c;该类负责创建自己的对象#xff0c;同时确保只有单个对象被创建。
这个…单例模式详解
单例模式是Java中最简单的设计模式之一。
这种类型的设计模式属于创建者模式它提供了一种访问对象的最佳方式。
这种设计模式涉及到一个单一的类该类负责创建自己的对象同时确保只有单个对象被创建。
这个类提供了一种访问其唯一对象的方式可以直接访问不需要实例化该类的对象。
二、单例模式的结构
懒汉式类加载不会导致该单实例对象被创建而是首次使用该对象时被创建
1、在内存里只有一个实例减少了内存的开销尤其是频繁的创建和销毁实例比如管理学院首页页面缓存。
缺点没有接口不能继承与单一职责原则冲突一个类应该只关心内部逻辑而不关心外面怎么样来实例化。
如何解决判断系统是否已经有这个单例如果有则返回如果没有则创建。
类加载时对象就被创建一直在内存中如果一直不适用该对象仍在会存在内存浪费问题
HungryChinese(){}//在该类中创建一个该类的对象供外界去使用private
HungryChinese();//提供一个公共的访问方式让外界获取hungryChinese对象public
{//获取单例类的对象因为对象私有只能通过方法去获取HungryChinese
HungryChinese.getInstance();HungryChinese
HungryChinese.getInstance();//判断是否为同一个对象System.out.println(instance.equals(instance1));}
HungryChinese2(){}//声明该类类型的变量private
hungryChinese2;//初始值为null//静态代码块中赋值static
HungryChinese2();}//对外提供的访问方式public
HungryChinese2.getInstance();HungryChinese2
HungryChinese2.getInstance();System.out.println(instance.equals(instance1));}
LazyMan(){}//声明LazyMan类型的变量private
instance;//只是声明了该类的对象没有赋初始值//对外提供访问方式public
getInstance(){//判断instance是否为null,如果为null,说明还没有创建LazyMan类的对象//如果没有创建一个并返回如果有直接返回//线程不安全多线程下会创建多个对象if
LazyMan.getInstance();System.out.println(instance.equals(instance1));}
LazyMan2(){}//声明LazyMan类型的变量private
instance;//只是声明了该类的对象没有赋初始值//对外提供访问方式public
getInstance(){//判断instance是否为null,如果为null,说明还没有创建LazyMan类的对象//如果没有创建一个并返回如果有直接返回if
null){//线程1等待线程2获取到cpu执行权也会进入到该判断里instance
LazyMan2.getInstance();LazyMan2
LazyMan2.getInstance();System.out.println(instance.equals(instance1));}
解决了线程不安全问题效率太低了每个线程在想获得类的实例时候执行getInstance()方法都要进行
同步。
而其实这个方法只执行一次实例化代码就够了后面的想获得该类实例
直接return就行了。
方法进行同步效率太低结论在实际开发中不推荐使用这种方式
LazyMan2(){}//声明LazyMan类型的变量private
instance;//只是声明了该类的对象没有赋初始值//对外提供访问方式public
getInstance(){//判断instance是否为null,如果为null,说明还没有创建LazyMan类的对象//如果没有创建一个并返回如果有直接返回if
LazyMan2.getInstance();LazyMan2
LazyMan2.getInstance();System.out.println(instance.equals(instance1));}
这种方式本意是想对第四种实现方式的改进因为前面同步方法效率太低
改为同步产生实例化的的代码块但是这种同步并不能起到线程同步的作用。
跟第3种实现方式遇到的情形一
另一个线程也通过了这个判断语句这时便会产生多个实例结论在实际开发中不能使用这种方式
双重检查锁模式解决了单例、性能、线程安全问题看似完美无缺其实存在问题在多线程情况下可能会出现空指针问题问题在于JVM在实例化对象时会进行优化和指令重排序操作。
解决空指针问题只需使用volatile关键字volatile可以保证可见性和有序性。
getInstance(){//第一次判断,如果instance不为null,不需要抢占锁直接返回对象if
LazyMan3.getInstance();LazyMan3
LazyMan3.getInstance();System.out.println(instance
Double-Check概念是多线程开发中常使用到的如代码中所示我们进行了两
null)检查这样就可以保证线程安全了。
这样实例化代码只用执行一次后面再次访问时判断if
直接return实例化对象也避免的反复进行方法同步.线程安全延迟加载效率较高结论在实际开发中推荐使用这种单例设计模式
静态内部类模式中实例由内部类创建由于JVM在加载外部类的过程中是不会加载静态内部类的只有内部类的方法/属性被调用时才会被加载并初始化静态属性静态属性由于被static修饰保证只能被初始化一次并且严格保证实例化顺序。
静态内部类模式是一种优秀的单例模式。
在没有任何锁的情况下保证了多线程下的安全并且没有任何性能影响和空间浪费。
LazyMan4.getInstance();LazyMan4
LazyMan4.getInstance();System.out.println(instance
这种方式采用了类装载的机制来保证初始化实例时只有一个线程。
静态内部类方式在Singleton类被装载时并不会立即实例化而是在需要实例化
时调用getInstance方法才会装载SingletonInstance类从而完成Singleton的
实例化。
类的静态属性只会在第一次加载类的时候初始化所以在这里JVM帮助我们
保证了线程的安全性在类进行初始化时别的线程是无法进入的。
优点避免了线程不安全利用静态内部类特点实现延迟加载效率高结论推荐使用
枚举类实现单例模式是极力推荐的单例实现模式因为枚举是线程安全的并且只会装载一次枚举类是所有单例类实现中唯一不会被破坏的单例模式。
LazyMan5.INSTANCE;System.out.println(instance
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback