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

鄂州门户网站上海网站建设优化seo

鄂州门户网站,上海网站建设优化seo,宣传页制作,广州网站排名专业乐云seo单例设计模式#xff08;Singleton Design Pattern#xff09;一个类只允许创建一个对象#xff08;或者实例#xff09;#xff0c;那这个类就是一个单例类#xff0c;这种设计模式就叫作单例设计模式#xff0c;简称单例模式。 单例有几种经典的实现方式#xff0c;…单例设计模式Singleton Design Pattern一个类只允许创建一个对象或者实例那这个类就是一个单例类这种设计模式就叫作单例设计模式简称单例模式。 单例有几种经典的实现方式它们分别是饿汉式、懒汉式、双重检测、静态内部类、枚举。 单例模式解决的问题 处理资源访问冲突资源的访问因为并发带来的问题。通过限制类的实例化过程单例模式确保在应用程序运行期间只会创建一个特定类的对象。这对于需要共享数据或资源的情况非常有用避免了多个实例同时操作导致数据不一致或资源浪费的问题。表示全局唯一类比如配置信息类。单例模式提供了一个全局访问点使得其他类可以轻松地访问该单例对象。这样可以方便地共享类的实例避免了频繁地传递对象实例的麻烦。 带来的好处 在一些场景中能减少内存的使用和性能提升。解决资源访问互斥的问题。节省资源由于单例模式只创建一个实例可以节省系统资源尤其是在需要频繁创建和销毁对象的场景下。维护一致性单例模式可以确保数据和资源的一致性因为只有一个实例进行操作避免了多个实例之间的竞争和冲突。全局访问单例模式提供了一个全局访问点使得其他对象可以轻松地获取实例方便了数据共享和交互。延迟实例化单例模式可以延迟对象的实例化只有在需要时才进行创建提高了系统的性能和效率。 缺点 高耦合性单例模式的实现通常需要在类中创建全局访问点这导致了对象的使用者与单例类之间存在高度的耦合性。这样一来当需要修改单例类时可能需要修改引用该类的所有代码增加了代码的维护难度。难以进行单元测试由于单例模式在全局范围内共享实例很难对单例对象进行模拟和替换从而使得单元测试变得困难。单元测试应该是隔离的、独立的而单例模式的全局特性会影响到测试结果增加了测试的复杂性。对象生命周期过长单例模式的对象在整个应用程序的生命周期中都存在无法自动释放和回收。如果不正确地使用和管理单例对象可能会导致内存泄漏或资源浪费的问题。不支持多线程并发访问某些实现方式的单例模式在多线程环境下可能会出现并发访问的问题需要进行额外的线程安全处理。例如懒汉式需要在获取实例时进行同步处理可能会影响性能。违反单一职责原则单例模式通常承担了过多的职责既要负责自身的逻辑功能又要管理对象的生命周期和资源等。这样违反了单一职责原则降低了代码的可读性和可维护性。 单例模式的实现 饿汉式 饿汉式是一种单例模式的实现方式其特点是在类加载时就创建并初始化了单例对象无论是否需要使用该对象。 类加载时即创建对象在饿汉式中单例对象的创建和初始化发生在类加载的过程中因此在应用程序启动时就已经存在一个单例对象。线程安全饿汉式的实现方式保证了在多线程环境下的线程安全性。由于单例对象在类加载时就被创建所以不存在多个线程同时访问和创建对象的情况避免了并发访问导致的线程安全问题。全局访问点饿汉式通过静态变量提供了一个全局访问点其他对象可以直接通过该变量获取单例对象方便了对单例对象的使用和操作。性能优化饿汉式避免了每次获取单例对象时的实例化开销因为对象在类加载时已经完成了实例化。这在某些场景下可以提高系统性能。 然而饿汉式也存在一些缺点 占用内存空间由于在类加载时就创建了单例对象所以该对象会一直存在于内存中无论是否被使用。如果单例对象占用较大内存可能会造成资源浪费。强耦合性饿汉式在类加载时就创建对象导致单例对象与类的生命周期紧密耦合难以灵活控制单例对象的创建和销毁。延迟加载不支持饿汉式无法实现延迟加载即只有当需要使用单例对象时才进行实例化。这可能在某些场景下造成不必要的开销。 因此在使用饿汉式时需要考虑以上优缺点并根据具体需求进行选择。 package com.iluwatar.singleton;/*** Singleton class. Eagerly initialized static instance guarantees thread safety. 单例类在类加载的时候instance 静态实例就已经创建并初始化好了所以instance 实例的创建过程是线程安全的。*/ public final class IvoryTower {/*** Private constructor so nobody can instantiate the class.* 构造器私有所以无法通过构造器创建这个类*/private IvoryTower() {}/*** Static to class instance of the class.* 静态变量初始化jvm加载的时候就会执行*/private static final IvoryTower INSTANCE new IvoryTower();/*** To be called by user to obtain instance of the class.* 通过这个方法获取这个类的实例* return instance of the singleton.*/public static IvoryTower getInstance() {return INSTANCE;} }懒汉式 懒汉式是单例模式的另一种实现方式。与饿汉式不同懒汉式在需要时才进行单例对象的创建和初始化也就是延迟加载。 以下是懒汉式的一般实现方式 私有化构造方法将单例类的构造方法声明为私有防止外部代码通过直接实例化来创建对象。提供静态方法获取实例通过一个静态方法来获取单例对象在该方法内部进行懒加载的处理。延迟加载在静态方法内部先判断单例对象是否已经被创建如果未创建则进行对象的实例化操作。否则直接返回已创建的对象。线程安全处理因为懒汉式在需要时才创建对象所以存在多线程环境下可能同时进入创建实例的判断逻辑的情况。因此需要在静态方法中增加同步控制保证只有一个线程可以创建实例。 懒汉式相对于饿汉式有一些优点 延迟加载懒汉式可以在需要时才进行实例化避免了在应用程序启动时就创建对象从而减少了不必要的资源消耗。线程安全控制通过在静态方法中增加同步控制可以保证在多线程环境下的线程安全性。 然而懒汉式也存在一些缺点 性能开销由于需要进行同步控制懒汉式在获取单例对象时可能会引入性能开销特别是在高并发环境下。双重检查锁机制问题懒汉式通常使用双重检查锁机制来实现延迟加载和线程安全。但这种方式在某些编程语言和平台下可能存在问题导致无法正确实现线程安全性。 因此在使用懒汉式时需要注意解决线程安全性问题并根据具体需求和场景综合考虑是否选择懒汉式作为单例模式的实现方式。 /*** pThread-safe Singleton class. The instance is lazily initialized and thus needs synchronization* mechanism./p懒汉式相对于饿汉式的优势是支持延迟加载。增加了类锁。**/ public final class ThreadSafeLazyLoadedIvoryTower {private static volatile ThreadSafeLazyLoadedIvoryTower instance;private ThreadSafeLazyLoadedIvoryTower() {// Protect against instantiation via reflectionif (instance ! null) {throw new IllegalStateException(Already initialized.);}}/*** The instance doesnt get created until the method is called for the first time.实例不能初始化直到第一次调用完成因为加了锁的。*/public static synchronized ThreadSafeLazyLoadedIvoryTower getInstance() {if (instance null) {instance new ThreadSafeLazyLoadedIvoryTower();}return instance;} }双重检测 双重检测Double-Checked Locking是一种在懒汉式中用于实现延迟加载和线程安全的机制。它是为了解决懒汉式在多线程环境下可能出现竞态条件Race Condition而引入的。 双重检测的基本原理如下 在静态方法中首先进行一次判断如果单例对象已经被创建则直接返回该对象避免不必要的同步开销。如果单例对象尚未创建则进入同步块。在同步块内部再次进行判断确保只有一个线程可以创建单例对象。在同步块内部创建单例对象并将其赋值给静态变量。最后返回单例对象。 通过双重检测机制可以减少对同步锁的使用提高性能。 需要注意的是在某些编程语言和平台下双重检测锁机制可能存在问题即所谓的双重检测锁失效问题导致无法正确实现线程安全性。为了解决这个问题可以使用volatile关键字来确保可见性或者使用其他线程安全的机制来实现延迟加载。 总之双重检测是一种在懒汉式中常用的实现方式可以在一定程度上解决线程安全和性能的问题但需要注意在具体的编程语言和平台上是否适用并仔细考虑是否需要额外的机制来确保线程安全性。 /*** pDouble check locking./p* 既支持延迟加载、又支持高并发的单例实现方式也就是双重检测实现方式* phttp://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html/p** pBroken under Java 1.4./p** author mortezaadigmail.com*/ public final class ThreadSafeDoubleCheckLocking {private static volatile ThreadSafeDoubleCheckLocking instance;/*** private constructor to prevent client from instantiating.构造器私有防止客户端调用初始化*/private ThreadSafeDoubleCheckLocking() {// to prevent instantiating by Reflection call抛出异常来防止反射调用if (instance ! null) {throw new IllegalStateException(Already initialized.);}}/*** Public accessor.** return an instance of the class.*/public static ThreadSafeDoubleCheckLocking getInstance() {// local variable increases performance by 25 percent// Joshua Bloch Effective Java, Second Edition, p. 283-284var result instance;// Check if singleton instance is initialized. 检查单例是否初始化如果初始化了就直接返回// If it is initialized then we can return the instance.if (result null) {// It is not initialized but we cannot be sure because some other thread might have// initialized it in the meanwhile. 多线程并发可能同时创建实例这里需要加锁。// So to make sure we need to lock on an object to get mutual exclusion.synchronized (ThreadSafeDoubleCheckLocking.class) {// Again assign the instance to local variable to check if it was initialized by some// other thread while current thread was blocked to enter the locked zone.// If it was initialized then we can return the previously created instance// just like the previous null check. 双重检查机制如果创建了则直接返回result instance;if (result null) {// The instance is still not initialized so we can safely// (no other thread can enter this zone)// create an instance and make it our singleton instance. 如果仍然没有创建则我们可以在此处创建一个对象并赋值。instance result new ThreadSafeDoubleCheckLocking();}}}return result;} }静态内部类 在单例模式中使用静态内部类实现是一种常见且线程安全的方式。通过静态内部类的特性可以实现延迟加载和线程安全的单例对象。通过静态内部类实现的单例模式具有延迟加载、线程安全和高效的特点。在需要使用单例对象的时候才会进行实例化而且能够保证多线程环境下的线程安全性。 /*** pThe Initialize-on-demand-holder idiom is a secure way of creating a lazy initialized singleton* object in Java./pInitialize on demand holder习惯用法是在Java中创建延迟初始化的单例对象的一种安全方法。** pThe technique is as lazy as possible and works in all known versions of Java. It takes* advantage of language guarantees about class initialization, and will therefore work correctly* in all Java-compliant compilers and virtual machines./p* 该技术尽可能懒惰适用于所有已知版本的Java。它利用了关于类初始化的语言保证因此将在所有符合Java的编译器和虚拟机中正确工作。* pThe inner class is referenced no earlier (and therefore loaded no earlier by the class loader)* than the moment that getInstance() is called. Thus, this solution is thread-safe without* requiring special language constructs (i.e. volatile or synchronized)./p**/ public final class InitializingOnDemandHolderIdiom {/*** Private constructor.*/private InitializingOnDemandHolderIdiom() {}/*** Singleton instance.** return Singleton instance*/public static InitializingOnDemandHolderIdiom getInstance() {return HelperHolder.INSTANCE;}/*** Provides the lazy-loaded Singleton instance.*/private static class HelperHolder {private static final InitializingOnDemandHolderIdiom INSTANCE new InitializingOnDemandHolderIdiom();} }枚举 使用枚举实现单例模式的优点包括 简洁明了枚举实现单例模式非常简洁只需声明一个枚举值即可获得唯一实例。线程安全枚举类型的实例是在类加载时初始化的因此保证了线程安全性。序列化和反序列化安全枚举类默认实现了Serializable接口因此枚举单例在进行序列化和反序列化时能够正确地保持实例的唯一性。 /*** pEnum based singleton implementation. Effective Java 2nd Edition (Joshua Bloch) p. 18/p** pThis implementation is thread safe, however adding any other method and its thread safety* is developers responsibility./p这种创建单例的方法是线程安全的但是添加其他方法的线程安全问题需要开发者处理。*/ public enum EnumIvoryTower {INSTANCE;Overridepublic String toString() {return getDeclaringClass().getCanonicalName() hashCode();} }以上内容基于GPT创建和整理。 参考 设计模式Java实现设计模式之美-王争
http://www.hkea.cn/news/14465475/

相关文章:

  • 超级简历模板官网百度百科优化排名
  • 地方门户网站的出路3天引流800个人技巧
  • 桂林北站到两江机场大巴时刻表53货源网下载app
  • 网站建设需求分析要做的事做网站的开发语言
  • 聊城建设路小学网站wordpress 自动登录
  • 网站开发vscwordpress文章标题总有网站名
  • 汕头网站搜索优化seo 优化一般包括哪些内容
  • 数据库作业代做网站网站实名认证功能怎么做
  • 福田搭建网站费用源码下载网
  • 西宁做腋臭北大网站l网上国网推广宣传语
  • 网站开发前后端分工wordpress 标签 热门
  • 怎样把网站做成app企业网络推广分析论文
  • 初中信息技术 网站制作个人做电商网站icp
  • 营销型网站建设msgg做网站怎么找公司
  • 做网站先买域名wordpress有多少模版
  • 科技期刊网站建设甘肃兰州海拔多少米
  • wordpress企业建站模版医疗网站报价方案
  • 中卫企业管理培训网站app开发公司怎么选择
  • 最好的模板网站建设网站需要什么设施?
  • 会展网站的建设情况网站备案有时间吗
  • 企业网站管理系统标签手册网页设计师职业要求
  • 资源专业网站优化排名工厂生产管理系统软件
  • 网易网站开发成都旅游攻略四天三夜
  • 计算机系毕设代做网站网站 文件验证
  • c语言除了做网站还能干什么展示型企业网站建设
  • 自己做网站需要什么条件开发板推荐
  • 网站制作制作网站建网站食品行业网站开发
  • 做简单最网站的软件是广州公司注册费用及流程
  • 资海网络一年做多少网站电子商务网站服务器
  • delphi 2010 网站开发一个简单的个人网站