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

搭建cms网站可以玩h5的网站

搭建cms网站,可以玩h5的网站,域名网站建设方案书模板,中山网站建设文化在软件开发领域#xff0c;设计模式是解决常见设计问题的有效方案#xff0c;而单例模式作为创建型设计模式中的一员#xff0c;其重要性不容小觑。它能够确保一个类仅有一个实例#xff0c;并提供全局访问点#xff0c;这一特性在资源管理、配置信息读取、线程池管理以及…在软件开发领域设计模式是解决常见设计问题的有效方案而单例模式作为创建型设计模式中的一员其重要性不容小觑。它能够确保一个类仅有一个实例并提供全局访问点这一特性在资源管理、配置信息读取、线程池管理以及日志记录等多个方面都发挥着关键作用。本文将深入探讨 Java 单例模式的多种实现方式、线程安全性、懒汉式与饿汉式的区别以及其应用场景等内容助力读者全面且深入地理解并熟练运用这一设计模式。 一、单例模式的概念 单例模式的核心是对一个类的实例化次数加以限制确保在整个应用程序运行期间该类仅有一个实例存在。这个实例的创建时机有两种常见情况一种是在类加载时就完成创建饿汉式另一种是在首次被访问时才进行创建懒汉式。并且会提供一个公共的静态方法作为获取该实例的唯一途径。通过这种方式单例模式能够有效地管控资源的使用避免因重复创建实例而导致的资源浪费同时也为全局资源的统一管理和访问提供了极大的便利。 二、单例模式的实现方式 一饿汉式单例 饿汉式单例在类加载阶段就创建实例。其优势在于线程安全性由 JVM 保障因为类加载过程本身就是线程安全的。以下是一个典型的饿汉式单例实现示例 public class EagerSingleton {// 私有静态实例在类加载时就初始化private static final EagerSingleton instance new EagerSingleton();// 私有构造函数防止外部实例化private EagerSingleton() {}// 公共静态方法获取单例实例public static EagerSingleton getInstance() {return instance;} }在上述代码中EagerSingleton 类的构造函数被私有化从而有效阻止了外部类对其进行实例化操作。instance 变量在类加载时便被创建并完成初始化由于其被 private static final 修饰这就确保了在整个应用程序的生命周期内该实例的唯一性。getInstance 方法则作为全局访问点任何需要使用这个单例实例的地方都可以通过调用此方法获取。 二懒汉式单例 懒汉式单例的特点是在首次被访问时才创建实例这种方式在一定程度上能够节省资源但需要特别关注线程安全问题。以下是一个简单的懒汉式单例示例 public class LazySingleton {// 私有静态实例初始化为 nullprivate static LazySingleton instance;// 私有构造函数private LazySingleton() {}// 公共静态方法获取单例实例需同步以保证线程安全public static synchronized LazySingleton getInstance() {if (instance null) {instance new LazySingleton();}return instance;} }在这个示例中instance 变量初始被赋值为 null。在 getInstance 方法中首先会检查 instance 是否为 null若为 null则创建一个新的 LazySingleton 实例并赋值给 instance。这里通过使用 synchronized 关键字来确保线程安全其作用是在多线程环境下当一个线程进入 getInstance 方法并创建实例时其他线程会被阻塞在同步块之外直至第一个线程完成实例创建并释放锁。然而这种方式在高并发场景下性能可能会受到较大影响因为每次获取实例都需要进行同步检查。 三双重检查锁定DCL单例 为了优化懒汉式单例在多线程环境下的性能表现可以采用双重检查锁定机制。这种方式在保障线程安全的同时能够有效减少不必要的同步开销。 public class DoubleCheckedLockingSingleton {// 私有静态实例使用 volatile 关键字保证可见性和禁止指令重排private static volatile DoubleCheckedLockingSingleton instance;// 私有构造函数private DoubleCheckedLockingSingleton() {}// 公共静态方法获取单例实例public static DoubleCheckedLockingSingleton getInstance() {if (instance null) {synchronized (DoubleCheckedLockingSingleton.class) {if (instance null) {instance new DoubleCheckedLockingSingleton();}}}return instance;} }在上述代码中instance 变量使用 volatile 关键字进行修饰。这是由于在多线程环境下指令重排可能会导致其他线程获取到尚未完全初始化的 instance。volatile 关键字能够确保变量的可见性即一个线程对 instance 的修改能够立即被其他线程察觉同时禁止指令重排从而保证对象的初始化顺序正确无误。双重检查锁定机制首先进行一次非同步的检查如果实例已经存在那么直接返回避免了不必要的同步操作若实例不存在则进入同步块再次检查并创建实例以此确保线程安全。 四静态内部类单例 静态内部类单例是一种较为优雅的实现方式它巧妙地融合了饿汉式和懒汉式的优点。 public class StaticInnerClassSingleton {// 私有构造函数private StaticInnerClassSingleton() {}// 静态内部类在类加载时不会立即加载private static class SingletonHolder {// 静态实例在静态内部类加载时创建private static final StaticInnerClassSingleton instance new StaticInnerClassSingleton();}// 公共静态方法获取单例实例public static StaticInnerClassSingleton getInstance() {return SingletonHolder.instance;} }在这个实现中SingletonHolder 是一个静态内部类。instance 实例在 SingletonHolder 类加载时创建由于静态内部类只有在被使用时才会加载所以实现了懒加载的效果。同时类加载过程的线程安全性确保了实例的唯一性无需额外的同步机制既保障了线程安全又提升了性能。 五枚举单例 使用枚举来实现单例模式是一种简洁且线程安全的绝佳方式。在 Java 中枚举类型的实例天然具有单例特性并且由 JVM 保证其唯一性和线程安全性。 public enum EnumSingleton {INSTANCE;// 可以在这里定义单例的其他方法和属性public void doSomething() {System.out.println(Doing something in EnumSingleton.);} }在上述代码中EnumSingleton 是一个枚举类型仅有一个实例 INSTANCE。可以在枚举中定义其他方法和属性通过 EnumSingleton.INSTANCE 即可访问这个单例实例并调用其方法。 三、线程安全性分析 一饿汉式 饿汉式单例在类加载时就创建实例由于类加载过程由 JVM 保证是线程安全的所以在多线程环境下无论多个线程同时访问 getInstance 方法多少次获取到的都将是同一个预先创建好的实例不会出现多个实例的情况。 二懒汉式 如前文所述简单的懒汉式单例通过在 getInstance 方法上使用 synchronized 关键字来确保线程安全。在多线程环境中当一个线程进入 getInstance 方法并创建实例时其他线程会被阻塞在同步块之外直至第一个线程完成实例创建并释放锁。这种方式虽然能够保证线程安全但同步开销较大尤其是在高并发场景下会对性能产生明显的影响。 三双重检查锁定DCL 双重检查锁定机制借助 volatile 关键字和两次 if 检查来保障线程安全。第一次非同步检查能够减少不必要的同步开销第二次同步块内的检查则确保了在多线程竞争的情况下只有一个线程能够成功创建实例。volatile 关键字保证了变量的可见性和禁止指令重排有效避免了其他线程获取到未完全初始化的实例。 四静态内部类 静态内部类单例利用了类加载的线程安全性。SingletonHolder 类只有在 getInstance 方法被调用时才会加载而类加载过程是线程安全的所以在多线程环境下不会出现多个实例的情况。 五枚举 枚举单例由 JVM 保证其线程安全性在多线程环境下无论多少个线程访问 EnumSingleton.INSTANCE获取到的都将是同一个实例并且不会出现实例化多次的问题。 四、懒汉式与饿汉式的区别 一创建时机 饿汉式在类加载时就创建实例无论该实例是否在后续的程序运行中被实际使用都会提前占用内存资源。这种方式适用于实例创建过程相对简单、占用资源较少并且在应用程序启动后就需要立即使用单例实例的场景。例如一些基础的配置类其在应用启动时就需要被加载并使用。懒汉式在首次被访问时才创建实例延迟了实例的创建过程只有在真正需要使用该实例时才会占用内存资源。对于那些创建过程复杂、资源消耗大或者不一定会被使用到的单例对象懒汉式单例能够显著提高资源利用率。比如某些涉及到复杂数据库连接或网络初始化的单例对象如果采用饿汉式可能会在应用启动时就进行不必要的资源消耗而懒汉式则可以避免这种情况。 二线程安全性 饿汉式由于类加载过程的线程安全性饿汉式单例天生就是线程安全的无需额外的同步机制。这使得在多线程环境下使用饿汉式单例时无需担心线程安全问题代码实现相对简单。懒汉式简单的懒汉式单例需要借助同步机制如 synchronized 关键字来保证线程安全这必然会带来一定的性能开销。尽管可以通过双重检查锁定等优化方式来减少同步开销但代码相对复杂并且需要考虑 volatile 关键字等因素增加了代码的维护难度。 三性能表现 饿汉式在类加载时创建实例可能会导致应用程序的启动时间略微延长尤其是当单例对象的创建过程较为复杂时。然而在应用程序运行过程中由于不需要进行同步检查获取实例的速度较快能够提供较好的运行时性能。懒汉式在低并发场景下懒汉式单例的性能表现可能较好因为只有在需要时才创建实例避免了不必要的资源占用。但在高并发场景下如果同步机制处理不当会导致性能大幅下降因为多个线程可能会竞争锁资源造成线程阻塞和等待从而影响整体性能。 五、单例模式的应用场景 一资源共享与管理 例如数据库连接池在应用程序中通常只需要一个数据库连接池实例来统一管理数据库连接资源。多个数据库操作可以共享这个连接池通过单例模式能够方便地实现连接池的全局访问和资源管理有效避免创建多个连接池导致的资源浪费和性能下降。如果每个数据库操作都创建自己的连接池不仅会消耗大量的系统资源还会增加数据库连接的管理复杂性而单例模式的数据库连接池可以很好地解决这些问题。 二配置信息读取 应用程序的配置信息在整个运行期间通常是固定不变的如数据库配置、日志配置等。可以采用单例模式创建一个配置管理器负责读取和管理配置信息其他模块则可以通过单例实例获取配置信息这样能够确保配置信息的一致性和全局可用性。例如在一个大型的企业级应用中不同的模块可能都需要访问数据库配置信息如果没有单例模式的配置管理器每个模块都自行读取配置文件可能会导致配置不一致的问题并且增加了配置文件管理的难度。 三线程池管理 线程池在多线程编程中用于管理线程资源提高线程的复用性和性能。使用单例模式创建线程池可以在整个应用程序中共享同一个线程池实例方便对线程任务进行统一的调度和管理避免创建多个线程池带来的资源竞争和管理复杂性。例如在一个 Web 应用中多个请求处理可能都需要使用线程池来执行异步任务如果每个请求都创建自己的线程池会导致系统资源的过度消耗和线程管理的混乱而单例模式的线程池可以有效地解决这些问题。 四日志记录器 在一个应用程序中通常只需要一个日志记录器来记录各种日志信息。单例模式可以确保只有一个日志记录器实例存在方便对日志的输出格式、级别、目标等进行统一管理和配置并且在多线程环境下也能保证日志记录的顺序和完整性。例如在一个分布式系统中多个节点可能都会产生日志信息如果每个节点都有自己的日志记录器那么在日志收集和分析时会面临诸多困难而单例模式的日志记录器可以将所有节点的日志信息统一管理便于后续的处理和分析。 六、总结 Java 单例模式是一种极为实用的设计模式通过限制类的实例化次数为一次并提供全局访问点在资源管理、配置信息处理、线程池和日志记录等众多场景中都有着广泛的应用。本文详细介绍了饿汉式、懒汉式、双重检查锁定、静态内部类和枚举等多种单例模式的实现方式深入分析了它们的线程安全性、懒汉式与饿汉式的区别以及应用场景。在实际开发过程中开发人员需要依据具体的需求和场景仔细权衡资源占用、线程安全和性能等多方面因素从而选择最为合适的单例模式实现方式以此构建高效、可靠的 Java 应用程序。同时随着 Java 语言的不断发展以及编程规范的持续演进对于单例模式的理解和应用也需要不断深入和优化以更好地适应日益复杂的软件开发需求。 希望通过本文的详细介绍读者能够对 Java 单例模式有更为透彻的理解并能够在实际项目开发中灵活自如地运用这一设计模式从而有效提升软件设计和开发的质量与效率。
http://www.tj-hxxt.cn/news/217379.html

相关文章:

  • 福建省建设职业注册资格管理中心网站汕头网站建设找千素网
  • 各个做网站的有什么区别可信的免费网站建设
  • 电商平台介绍网站模板广州网站设计建设公司
  • 东莞手机网站制作公司网站为什么建设中
  • 做网站大wordpress分享查看内容
  • 开发一个网站要多久apple 官网网站模板
  • 网站建设的图片台州网站建站公司
  • 推广业务网站建设做签证的网站
  • 北京网站建设公司司开题报告风景区网站开发
  • 全国首批9所重点马院网站建设牡丹江市住房和城乡建设局网站
  • 做科技汽车的视频网站有哪些内容自己做的网站根目录哪里找到
  • 珠宝网站建设要以商为本大良网站建设dwxw
  • 如何做图片网站南海佛山网站建设
  • 陕西 餐饮 网站建设长治百姓网免费发布信息网
  • dw做网站小技巧做同城服务网站比较成功的网站
  • 哪个做网站平台好南沙免费网站建设
  • 汕头网站制作公司价格网上购物商城网站建设
  • 在线做春节网站怎样提高网站首页权重
  • 百度 特定网站搜索nginx 搭建wordpress
  • 网站300m是什么意思广州外贸公司排名前十
  • 网站小边框元素使用wordpress制作海报
  • 永州网站建设收费情况中文网站建设中模板
  • 网站里的聊天怎么做哈尔滨关键词优化效果
  • 怎么在网站中添加百度商桥wordpress首页文章带图
  • 山东系统建站怎么用中能建设集团电子商务网站
  • 制作网站需要钱吗网站怎么做下拉刷新
  • 公司网站建设浩森宇特三水网站建设首选公司
  • 配资网站建设是什么上海做网站的费用
  • 东莞营销网站建设服务韩国设计公司网站
  • 在线购物网站开发项目微网站建设套餐