静态内部类实现单例_看到“java单例模式”脑壳疼的仁兄,学会这几招是不是分分钟搞定...

单例模式

单例模式(Singleton),也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。

比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。

4a9393328f57262ad2873f9abb8b4876.png

单例模式的运用场景

  • 外部资源:每台计算机有若干个打印机,但只能有一个PrinterSpooler,以避免两个打印作业同时输出到打印机。
  • Windows的Task Manager(任务管理器)就是很典型的单例模式(这个很熟悉吧),想想看,是不是呢,你能打开两个windows task manager吗?
  • 多线程的线程池的设计一般也是采用单例模式,这是由于线程池要方便对池中的线程进行控制。
625c5688775ba7b29be737a8af48f6ed.png

实现单例模式的方法思路

一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称);

当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用。

同时我们 还将该类的构造函数定义为私有方法,这样其他处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例。

6fc8b9b0e372b4feb9c827ee63616711.png

实现单例模式的方式

01

懒汉单例式

  • 天生线程不安全:这种方式是最基本的实现方式,这种实现最大的问题就是不支持多线程。因为没有加锁 synchronized,所以严格意义上它并不算单例模式。
aa6c6c53df4899c7222de05b29d380c4.png
455b43447b5a1f5dfd3363cc738d0fdd.png
  • 天生线程不安全:这种方式具备很好的 lazy loading,能够在多线程中很好的工作,但是,效率很低,99% 情况下不需要同步。
89902d2099e8ee507b55b1d0a6902a09.png
c52567cac195a88b434d04a8aa17bf40.png

02

饿汉单列式

这种方式比较常用,但容易产生垃圾对象。

e516c1f922365b80246891423fd13b2f.png
f54cca6294d1c51f008c7feceb89ed39.png

03

静态内部类的方式

这种方式能达到双检锁方式一样的功效,但实现更简单。对静态域使用延迟初始化,应使用这种方式而不是双检锁方式。这种方式只适用于静态域的情况,双检锁方式可在实例域需要延迟初始化时使用。

2228c7acca54489807d0ce315881d443.png
9d05dc8150b238a25f936ed76a09bd11.png

04

枚举

这种实现方式还没有被广泛采用,但这是实现单例模式的最佳方法。它更简洁,自动支持序列化机制,绝对防止多次实例化。

0e4e484544c8c2af035f813f74d50ec4.png
1cf80ad08696a17d2343381b30a32134.png

资源加载和性能区别

饿汉式在类创建的同时就实例化一个静态对象出来,不管之后会不会使用这个单例,都会占据一定的内存,但是相应的,在第一次调用时速度也会更快,因为其资源已经初始化完成。

而懒汉式,会延迟加载,在第一次使用该单例的时候才会实例化对象出来,第一次调用时要做初始化,如果要做的工作比较多,性能上会有些延迟,之后就和饿汉式一样了。

静态内部类的方式资源利用率高,但第一次加载时反应不够快;java中饿单例模式性能优于懒单例模式,若对资源十分在意可以采用静态内部类。

9b58fb8e5effcb5ad4df814023ff90d9.png

今天的文章就分享到这里啦,喜欢编程的小伙伴可以关注我哦!有学习方面的问题可以私信回复:学习!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值