【源码分析设计模式 1】JDK中的单例模式

Java容器之ConcurrentHashMap源码分析(JDK 1.7与JDK 1.8对比)   在前面两篇博客 Java容器之HashMap源码分析、Java容器之Hashtable源码分析分别对JDK1.8中的HashMap、Hashtable的源码进行一些分析,在本篇博客将对ConcurrentHashMap容器的源码进行一些分析。 申明:在前两篇博客介绍了两个容器的增、删、改、查相关的API,并且给源码加上了中文注释,在本篇博客将只介绍一些关键的API,比如hash值的计算,put... 阅读详情

🍅 Java基础教程系列:Java基础教程系列

🍅 Java学习路线配套文章:搬砖工逆袭Java架构师

🍅 Java经典面试题大全:10万字208道Java经典面试题总结(附答案)

🍅 简介:Java领域优质创作者🏆、优快云哪吒公众号作者✌ 、Java架构师奋斗者💪

🍅 扫描主页左侧二维码,加入群聊,一起学习、一起进步 

🍅 欢迎点赞 👍 收藏 ⭐留言 📝   

一、基本介绍

单例模式比较简单,可以说没有复杂的调用和接口的设计,就是一个简单的类,只是要求这个类只生成一个对象,无论什么时候都要保证这一点,因此只能生成一个实例的模式就是单例模式。

1、单例模式要素

  • 私有构造方法;
  • 私有静态引用指向自己实例 ;
  • 以自己实例为返回值的公有静态方法;

二、类的加载

类的加载是通过类加载器(Classloader)完成的,它既可以是饿汉式加载类,也可以是懒汉式加载,这跟不同的JVM实现有关。加载完类后,类的初始化就会发生,如果是对一个类的主动使用就会初始化对象,对类的被动使用不会对类进行初始化,比如final修饰的静态变量如果能在编译时就确定变量的取值,会被当做常量,作为对一个类的被动使用不会导致类的初始化。以下情况类被初始化:

类初始化的一些规则:

1、类从顶到底的顺序初始化,所以声明在顶部的字段遭遇底部的字段初始化;
2、超类早于子类和衍生类的初始化;
3、如果类的初始化是由于访问静态域而触发,那么只能声明静态域的类才被初始化,而不会触发超类的初始化或者子类的初始化,即使静态域被子类或子接口或者它的实现类锁引用;
4、接口初始化不会导致父接口的初始化;
5、静态域的初始化时在类的静态初始化期间,非静态域的初始化是在类的实例创建期间,这意味着静态域初始化在非静态域之前;
6、非静态域通过构造器初始化,子类在做任何初始化之前构造器会先调用父类的构造器,它保证了父类非静态或实例变量初始化早于子类;

三、单例模式的优缺点

1、优点

(1)在单例模式中,活动的单例只有一个实例,对单例类的所有实例化得到的都是相同的一个实例。这样就 防止其它对象对自己的实例化,确保所有的对象都访问一个实例;

(2)单例模式具有一定的伸缩性,类自己来控制实例化进程,类就在改变实例化进程上有相应的伸缩性;

(3)提供了对唯一实例的受控访问;

(4)由于在系统内存中只存在一个对象,因此可以 节约系统资源,当需要频繁创建和销毁的对象时单例模式无疑可以提高系统的性能;

(5)允许可变数目的实例;

(6)避免对共享资源的多重占用;

2、缺点

(1)不适用于变化的对象,如果同一类型的对象总是要在不同的用例场景发生变化,单例就会引起数据的错误,不能保存彼此的状态;

(2)由于单例模式中没有抽象层,因此单例类的扩展有很大的困难;

(3)单例类的职责过重,在一定程度上违背了“单一职责原则”;

(4)滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失;

四、单例模式的使用场景

单例模式只允许创建一个对象,因此节省内存,加快对象访问速度,因此对象需要被公用的场合适合使用,如多个模块使用同一个数据源连接对象等等。

1、需要频繁实例化然后销毁的对象;

2、创建对象时耗时过多或者耗资源过多,但又经常用到的对象;

3、有状态的工具类对象;

4、频繁访问数据库或文件的对象;

五、单例模式的经典场景

1、资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如上述中的日志文件,应用配置;

2、控制资源的情况下,方便资源之间的互相通信。如线程池等;

3、应用场景举例:

(1)外部资源:每台计算机有若干个打印机,但只能有一个PrinterSpooler,以避免两个打印作业同时输出到打印机。内部资源:大多数软件都有一个(或多个)属性文件存放系统配置,这样的系统应该有一个对象管理这些属性文件 

(2)Windows的Task Manager(任务管理器)就是很典型的单例模式(这个很熟悉吧),想想看,是不是呢,你能打开两个windows task manager吗? 不信你自己试试看哦~ 

(3)windows的Recycle Bin(回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。 

(4)网站的计数器,一般也是采用单例模式实现,否则难以同步。 

(5)应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。 

(6) Web应用的配置对象的读取,一般也应用单例模式,这个是由于配置文件是共享的资源。 

(7)数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。数据库软件系统中使用数据库连接池,主要是节省打开或者关闭数据库连接所引起的效率损耗,这种效率上的损耗还是非常昂贵的,因为何用单例模式来维护,就可以大大降低这种损耗。 

(8)多线程的线程池的设计一般也是采用单例模式,这是由于线程池要方便对池中的线程进行控制。  

(9)操作系统的文件系统,也是大的单例模式实现的具体例子,一个操作系统只能有一个文件系统。 

(10)HttpApplication 也是单位例的典型应用。熟悉ASP.Net(IIS)的整个请求生命周期的人应该知道HttpApplication也是单例模式,所有的HttpModule都共享一个HttpApplication实例。

六、单例模式的实现方法

1、饿汉式单例

public class Singleton {
    private Singleton() {}
    private static final Singleton single = new Singleton();
    public static Singleton getInstance() {
        return single;
    }
    //单例模式,构造器要私有化
    private SingletonTest {
    }
}

因为这本身就是static修饰的方法,所以是在类加载的时候被创建,后期不会再改变,所以线程是安全的。

2、懒汉式单例

//有线程安全的问题,不推荐使用
public class SingletonTest {
    public static SingletonTest singleton = null;
    public static SingletonTest getInstance(){
        if(singleton == null){
            singleton = new SingletonTest();
        }
        return singleton;
    }
    //单例模式,构造器要私有化
    private SingletonTest {
    }
}

懒汉式方法总是会出现这样或那样的问题的,因为考虑到了多线程机制,实现起来比较麻烦,并且还会出现问题,就算是使用了一定的解救办法(同步、加锁、双重判断)的办法,性能还是被损耗了,因此懒汉式方法的不推荐使用。

3、静态内部类实现单例

package designMode.singleton;
 
public class Singleton {
    private static class SingleTonHoler{
        private static Singleton INSTANCE = new Singleton();
    }
 
    public static Singleton getInstance(){
        return SingleTonHoler.INSTANCE;
    }
 
    //单例模式,构造器要私有化
    private SingletonTest {
    }
}

(1)静态内部类实现单例的优点是:外部类加载时并不需要立即加载内部类,内部类不被加载则不去初始化INSTANCE,故而不占内存。即当SingleTon第一次被加载时,并不需要去加载SingleTonHoler,只有当getInstance()方法第一次被调用时,才会去初始化INSTANCE,第一次调用getInstance()方法会导致虚拟机加载SingleTonHoler类,这种方法不仅能确保线程安全,也能保证单例的唯一性,同时也延迟了单例的实例化。

(2)当getInstance()方法被调用时,SingleTonHoler才在SingleTon的运行时常量池里,把符号引用替换为直接引用,这时静态对象INSTANCE也真正被创建,然后再被getInstance()方法返回出去,这点同饿汉模式。那么INSTANCE在创建过程中又是如何保证线程安全的呢?在《深入理解java虚拟机》中,有这么一句话:

虚拟机会保证一个类的<clinit>()方法在多线程环境中被正确地加锁、同步,如果多个线程同时去初始化一个类,那么只会有一个线程去执行这个类的<clinit>()方法,其它线程都需要阻塞等待,直到活动线程执行<clinit>()方法完毕。如果一个类的<clinit>()方法中有耗时很长的操作,就有可能造成多个进程阻塞(需要注意的是,其它线程虽然会被阻塞,但如果执行<clinit>()方法后,其它线程唤醒之后不会再次进入<clinit>()方法。同一个加载器下,一个类型只会初始化一次。)在实际应用中,这种阻塞往往是隐蔽的。

<clinit>()方法简介:

1、先理解类初始化阶段的含义:该阶段负责为类变量赋予正确的初始值,是一个类或接口被首次使用前的最后一项工作。

2、<clinit>()方法的执行时期:类初始化阶段(该方法只能被JVM调用,专门承担类变量的初始化工作)。

3、<clinit>()方法的内容:所有的类变量初始化语句和类型的静态初始化器。

4、类的初始化时机:

  • 首次创建某个类的新实例时(new,反射,克隆,反序列化);
  • 首次调用某个类的静态方法时;
  • 首次使用某个类或接口的静态字段或对该字段(final字段除外)赋值时;
  • 首次调用java的某些反射方法时;
  • 首次初始化某个类的子类时;
  • 首次在虚拟机启动时某个含有main()方法的那个启动类。

5、注意:并非所有的类都拥有一个<clinit>()方法,满足下列条件之一的类不会拥有<clinit>()方法:

  • 该类没有声明任何类变量,也没有静态初始化语句;
  • 该类声明了类变量,但没有明确使用类变量初始化语句或静态初始化语句初始化;
  • 该类仅包含静态final变量的类变量初始化语句,并且类变量初始化语句是编译时常量表达式。

故而,可以看出INSTANCE在创建过程中是线程安全的,所以说静态内部类形式的单例可保证线程安全,也能保证单例的唯一性,同时也延迟了单例的实例化。

那么,是不是可以说静态内部类实现单例模式就是完美的了呢?其实不然,静态内部类实现单例也有一个致命的缺点,就是传参的问题,由于静态内部类的形式创建单例,故而无法传递参数进去,例如Contxt这种参数,所以我们创建单例时,可以根据实际情况,进行斟酌。

4、双检锁/双重校验锁

描述:采用双锁机制,安全且在多线程情况下能保持高性能。

package designMode;
 
public class Singleton {
    private volatile static Singleton singleton;
    public static Singleton getSingleton(){
        if(singleton==null){
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
    //构造函数私有化
    private Singleton(){
    }
}

这里的两次判断,第一判断:效率,第二判断:避免同步。之所以这样是因为避免加锁后,再次加锁。大大增强了执行效率。推荐使用!

5、枚举实现单例

(1)枚举单例(Enum Singleton)在Effective Java一书中提到,因为其功能完善,使用简洁,无偿的提供了序列化机制,在面对复杂的序列化或者反射攻击时依然可以绝对防止多次实例化等优点,被作者所推崇。

(2)枚举单例写法简单

如上文提到的DCL(double checked locking),实在是优点麻烦,枚举单例相对简单的多。下面这段代码就是声明枚举实例的通常做法,它可能还包含实例变量和实例方法,枚举单例是线程安全的。

public enum  DataSourceEnum {
    DATASOURCE;
    private DBConnection connection = null;
    private DataSourceEnum(){
        connection = new DBConnection();
    }
    public DBConnection getConnection(){
        return connection;
    }
}

八、JDK中的单例模式

1、Runtime

Runtime类封装了Java运行时环境。每一个Java程序实际上都启动了一个JVM进程,那么每个JVM进程都对应一个Runtime实例,此实例由JVM为其实例化。每个Java应用程序都有一个Runtime实例,使应用程序能够与其运行的环境相连接。

由于Java是单进程的,所以,在一个JVM中,Runtime的实例应该只有一个。所以应该使用单例来实现。

2、java.awt.Toolkit

懒汉式单例。不需要事先创建好,只要在第一次真正用到的时候再创建就可以了。因为很多时候并不常用Java的GUI和其中的对象。如果使用饿汉单例的话会影响JVM的启动速度。

九、总结

1、当一个类的对象只需要或者只可能有一个时,应该考虑单例模式。

2、如果一个类的实例应该在JVM初始化时被创建出来,应该考虑使用饿汉式。

3、如果一个类的实例不需要预先被创建,也许这个类的实例并不一定能用得上,也许这个类的实例创建过程比较耗费时间,也许就是真的没必要提前创建。那么应该考虑懒汉式。

4、在使用懒汉式单例的时候,应该考虑到线程的安全性问题。

🍅 Java基础教程系列:Java基础教程系列

🍅 Java学习路线配套文章:搬砖工逆袭Java架构师

🍅 Java经典面试题大全:10万字208道Java经典面试题总结(附答案)

🍅 简介:Java领域优质创作者🏆、优快云哪吒公众号作者✌ 、Java架构师奋斗者💪

🍅 扫描主页左侧二维码,加入群聊,一起学习、一起进步 

🍅 欢迎点赞 👍 收藏 ⭐留言 📝   

 

添加微信,备注1024,赠送Java学习路线思维导图  

Logisim实战:手把手教你设计硬布线版MIPS CPU(多周期/8指令/附电路图) 本文是一份详细的Logisim实战指南,手把手教你设计一个采用硬布线控制的多周期MIPS CPU。文章深入剖析了硬布线控制与微程序控制的核心理念差异,并逐步讲解了从定义执行状态、构建状态跳转逻辑到生成控制信号、集成测试的完整流程,最终实现一个支持8条指令、可运行简单程序的处理器模型。 阅读详情

相关推荐

云漾AI创作平台实战:如何用GPT4.0+Midjourney快速生成商业级插画(附Prompt模板)

本文详细介绍了如何利用云漾AI创作平台结合GPT4.0和Midjourney快速生成商业级插画。通过智能文案生成与视觉化工作流,大幅提升创作效率,适用于电商、社交媒体等多种场景。文章包含实用Prompt模板和参数调整技巧,帮助设计师和内容创作者高效产出专业插画。

weixin_29251567的博客 217

设计模式实战——开发中常用到的单例模式

定义:单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。特点单一实例:通过私有构造函数或静态方法确保整个应用中只存在一个实例对象。全局访问点:提供一个静态方法供外部调用,以获取该类的唯一实例。延迟初始化:在需要时才创建实例,以节省资源并提高效率。JDK中的单例模式主要体现在Runtime类和GUI相关类中。Runtime类定义与特点。

2301_76419561的博客 1565

【HCIP-AI 进阶之路(一)】零成本白嫖算力,7天速通华为人工智能资深开发者认证

《HCIP-AIEIDeveloper认证备考指南》摘要:本文深度解析华为HCIP-AI(H13-331)认证考试要点,涵盖考试大纲、评分标准及备考策略。重点剖析昇腾AI全栈架构,包括达芬奇架构核心计算单元(Cube/Vector/Scalar Unit)和四大层级关系(芯片-CANN-框架-应用)。针对无硬件资源的开发者,提供MindSpore CPU版、ModelArts免费算力和沙箱实验室三种零成本实践方案。文章强调该认证对国企/华为生态企业求职者的价值,并指出多选题是主要失分点。下篇将聚焦计算机视觉

2301_82049134的博客 1181

JDK 中用到了哪些设计模式?

抽象⼯⼚模式提供了⼀个协议来⽣成⼀系列的相关或者独⽴的对象,⽽不 ⽤指定具体对象的类型。如果创建⼀个对象的实例⾮常复杂且 耗时时,就可以使⽤这种模式,⽽不重新创建⼀个新的实例,你可以拷⻉ ⼀个对象并直接修改它。动态的给⼀个对象附加额外的功能,这也是⼦类的⼀种替代⽅式。它们也很容 易识别,⼀个创建新对象的⽅法,返回的却是接⼝或者抽象类的,就是抽 象⼯⼚模式了。提供⼀个⼀致的⽅法来顺序访问集合中的对象,这个⽅法与底层的集合的 具体实现⽆关。代理模式是⽤⼀个简单的对象来代替⼀个复杂的或者创建耗时的对象。

6个日的博客 1423

Lede(OpenWrt)安装和双宽带叠加

LEDE是一个专为路由器和嵌入式设备设计的自由和开源的操作系统。LEDE是OpenWRT项目的一个分支项目。LEDE操作系统包括许多路由器有用的功能,如网络地址转换、防火墙、端口转发、DHCP服务器等。

我的博客 6441

手把手教你用CubeMX给GD32F103点灯、调串口(附完整工程)

本文详细介绍了如何使用CubeMX为GD32F103开发板配置GPIO点灯和串口通信,包含完整的工程创建、代码构建和测试流程。特别强调了GD32与STM32的差异点及常见避坑技巧,帮助开发者快速上手GD32开发。

weixin_42566424的博客 313

JDK中的设计模式之单例模式

1JDK中单例模式的体现 首先看一下一段JDK 源码中的Runtime类的一段代码 public class Runtime { private static Runtime currentRuntime = new Runtime(); public static Runtime getRuntime() { return currentRuntime; }...

348

Tomcat漏洞——弱口令爆破

靶机:CentOS7 IP:192.168.100.40。攻击机:kali IP:192.168.100.60。版 权 声 明:本博客所有文章除特别声明外,均采用。文章版权归作者所有,未经允许请勿转载!作 者:PeiyuJue。

weixin_57379923的博客 909

JDK中常见的设计模式

JDK中常见的设计模式 单例模式(Singleton pattern)用于 Runtime,Calendar 和其他的一些类中。 工厂模式(Factory pattern)被用于各种不可变的类如 Boolean,像 Boolean.valueOf。 观察者模式(Observer pattern)被用于 Swing 和很多的事件监听中。 装饰器设计模式(Decoratordesign pattern)被用于多个 Java IO 类中。 #单例模式 单例模式重点在于在整个系统上共享一些创建时较耗资源的对象。整个

小唐的博客 1687

百万 Token 压力实测:1M Context 的真实能力边界在哪里?

本文揭示了长上下文模型的性能衰减规律:1M上下文存在"容量曲线"与"质量曲线"的分歧,512K是可靠拐点。通过MRCR测试发现,不同任务类型衰减差异显著——检索任务在512K后性能下降30.6%,而生成任务仅下降5%。研究提出三阶段补偿策略:三明治注入(首尾指令强化)、语义面包屑(位置标记)、引用检查(强制溯源),可将512K-1M区间的可用性提升20%。工程实践表明,中段区域(30-70%位置)是注意力薄弱区,需要特殊处理。最终建议:关键检索任务控制在512K内,关联推理任务可扩展至

liuzhupeng的专栏 337

在 SAP S/4HANA Cloud Public Edition 中掌控 ABAP 生命周期管理:One-Off、Multi-Off 与 Scalable Delivery 的落地方法论

本文系统梳理了SAP S/4HANA Cloud Public Edition中ABAP扩展开发的三种生命周期管理模式:One-Off适用于企业内部扩展,通过Import Collection在三系统间流转;Multi-Off面向少量客户交付,基于gCTS和Git实现不连接系统间的传输;Scalable Delivery则将扩展产品化为add-on,支持规模化分发。文章结合RAP、OData等实际开发场景,对比分析了各模式的特点与适用边界,为国内团队提供了符合Public Cloud要求的开发与交付实践建议

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1495

java源码单例模式_JDK源码——单例模式

JDK源码中单例模式的应用1、Runtime类Runtime类封装了Java运行时的环境。每一个java程序实际上都是启动了一个JVM进程,那么每个JVM进程都是对应这一个Runtime实例,此实例是由JVM为其实例化的。每个Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。由于Java是单进程的,所以,在一个JVM中,Runtime的实例应该只有一个。所以应...

weixin_33970380的博客 501

【Qt】QtCreator远程部署、调试程序

1)QtCreator 工具–> 选项 --> 设备 --> 添加2)设备设置向导选择–> Generic Linux Device --> 开启向导3)填写“标识配置的名称”(随便写)、设备IP、用户名 --> 下一步4)选择配对秘密文件,第一次配对,可以不填写,点击“下一步”5)点击“完成”6)设备添加成功,需要再配置SSH端口号、用户名、密码等7)保存SSH登陆密码:验证类型选择默认“Default”–> “创建新密钥”–> “Test”

郭老二 5193

【源码分析设计模式 1】JDK中的单例模式,送大厂面经一份

包含最全MySQL、Redis、Java并发编程等等面试题和答案,用于参考~

m0_60707538的博客 358

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【设计模式】单例模式的八种写法分析

网上泛滥流传单例模式的写法种类,有说7种的,也有说6种的,当然也不排除说5种的,他们说的有错吗?其实没有对与错,刨根问底,写法终究是写法,其本质精髓大体一致!因此完全没必要去追究写法的多少,有这个时间还不如跟着宜春去网吧偷耳机、去田里抓青蛙得了,一天天的....

宜春 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java设计模式——单例模式

介绍Java设计模式的八种单例模式

m0_62946761的博客 7270

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【面试精讲】MyBatis设计模式及源码分析,MyBatis设计模式实现原理

每个设计模式的实现都体现了MyBatis设计的巧妙和优雅,通过这些模式的应用,MyBatis成功地将框架的灵活性、可扩展性和维护性提升到了一个新的高度。希望通过这三部分的解析,你能对MyBatis的设计和实现有一个更加深入的理解。

小明的Java问道之路 12万+

JAVA设计模式——单例模式八种方式

目录 单例模式简介: 应用场景: 单例设计模式的八种方式: 1、饿汉式(静态常量) 2、饿汉式(静态代码块) 3、懒汉式(线程不安全) 4、懒汉式(线程安全,同步方法) 5、懒汉式(线程安全,同步代码块) 6、双重检查(推荐使用) 7、静态内部类(推荐使用) 8、枚举(推荐使用) 单例模式在JDK应用的源码分析 单例模式注意事项和细节说明 单例模式简介: 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供

龍弟-idea的博客 7110

设计模式在 JDK 中的具体应用与分析

GOF 设计模式是面向对象设计中常见问题的可复用解决方案,通过 23 种经典模式 提供了一套标准化的设计思路,用于解决软件设计中反复出现的架构和交互问题。这意味着应该能够在不修改现有代码的情况下,让软件的行为发生变化(通常通过添加新代码来完成)2、使用多个隔离的接口,比使用单个接口(多个接口方法集合到一个的接口)要好。组合对象或类,形成更大结构的灵活方案,不破坏原有结构。1、上层模块不应该依赖底层模块,它们都应该依赖于抽象。2、抽象不应该依赖于细节,细节应该依赖于抽象。

肢解生活,直达本质;凡所有相,皆是虚妄。 1301

JAVA设计模式>>单例模式

本文深入探讨了单例模式的多种实现方式,包括饿汉式(静态常量、静态代码块)、懒汉式(线程不安全、线程安全的同步方法和同步代码块) 以及双重检查锁、静态内部类和枚举类型等。每种方式都详细展示了相应的代码实现,并分析了它们在多线程环境下的安全性和性能表现。此外,还通过分析JDK中的经典应用案例(如java.lang.Runtime类)展示了单例模式在实际开发中的应用。最后分析了单例模式的注意事项和细节处理

2401_85014515的博客 3378

JDK1.8中的ConcurrentHashMap源码分析

JDK1.8中的ConcurrentHashMap源码分析 一、容器初始化 1、源码分析 在jdk8的ConcurrentHashMap中一共有5个构造方法,这四个构造方法中都没有对内部的数组做初始化, 只是对一些变量的初始值做了处理 jdk8的ConcurrentHashMap的数组初始化是在第一次添加元素时完成 // 没有维护任何变量的操作,如果调用该方法,数组长度默认是16 public ConcurrentHashMap() { } // 传递进来一个初始容量,ConcurrentHashMa

小小小小小乐的博客 5099

Java 设计模式 - 单例模式

Java 设计模式 - 单例模式 作者: 霍英俊 [huo920@live.com] 文章目录Java 设计模式 - 单例模式单例设计模式介绍单例设计模式八种方式饿汉式 - 静态常量饿汉式(静态常量)应用实例优缺点说明饿汉式 - 静态代码块饿汉式(静态代码块)应用实例优缺点说明懒汉式 - 线程不安全懒汉式线程不安全应用实例优缺点说明懒汉式 - 线程安全,同步方法懒汉式线程安全,同步方法应用实例优缺点说明懒汉式 - 线程安全,同步代码块懒汉式 线程安全,同步代码块应用实例优缺点说明懒汉式 - 双重检查 - 推

霍英俊 1735

【深入设计模式】单例模式—从源码分析内部类单例、枚举单例以及单例模式在框架中的应用

最完美的单例写法以及单例模式在源码中的应用

SK_Jaco的博客 780

设计模式 -- 单例模式

文章目录1、单例设计模式介绍2、单例设计模式八种方式饿汉式(静态常量)饿汉式(静态代码块)懒汉式(线程不安全)懒汉式(线程安全,同步方法)懒汉式(线程安全,同步代码块)双重检查静态内部类枚举3、单例模式在 JDK 应用的源码分析4、单例模式注意事项和细节说明 1、单例设计模式介绍         所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例, 并且该类只提供一个取得其对象实例的方

Syntactic Sugar 227

单例模式在JDK中的应用

话不多说,直接上源码 在Runtime类中使用了单例模式: public class Runtime { //静态方法的方式创建对象 private static Runtime currentRuntime = new Runtime(); /** * Returns the runtime object associated with the current ...

Clover的博客 542

java源码单例模式_设计模式(一)——Java单例模式(代码+源码分析)

1)单例模式保证了系统内存中该类只存在一个对象,节省了系统资源,对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能2)当想实例化一个单例类的时候,必须要记住使用相应的获取对象的方法,而不是使用new3)单例模式使用的场景:需要频繁的进行创建和销毁的对象、创建对象时耗时过多或耗费资源过多(即:重量级对象),但又经常用到的对象、工具类对象、频繁访问数据库或文件的对象(比如数据源、sess...

weixin_28802509的博客 379
上一篇: 【源码分析设计模式 10】SpringMVC中的适配器模式
下一篇: 【源码分析设计模式 5】Java I/O系统中的装饰器模式
哪 吒
哪 吒 2022年度博客之星TOP 1 2022年度博客之星TOP 1 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 59万+粉丝 2933原创
评论 15
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哪 吒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值