带你玩转单例模式(懒汉式,饿汉式,枚举)

欢迎访问我的个人博客 站(点击进入)

单例模式

1.单例模式简介

单例模式,属于创建类型的一种常用的软件设计模式。通过单例模式的方法创建的类在当前进程中只有一个实例。为了保证这个类只有一个实例,所以我们需要进行构造函数私有化,并通过其他的方法去获取实例

2.饿汉式

饿汉式,根据名字我们能想到,一个饥饿的人什么都想吃,所以饿汉式单例模式是通过静态变量提前声明的方式得到这个变量。
代码实现:

弊端:

  • 对象的实例是静态的,就说明我们即使不适用这个对象,它也存在,那么如果这个变量占用内存很大,那么很显然会造成浪费

3.懒汉式

懒汉式单例模式,通过判断这个对象是否存在,如果存在就直接返回这个对象,将new对象延迟到了获得对象的方法中,实现了懒加载,解决了饿汉式可能造成空间浪费的弊端

但是,这种写法在多线程环境下是不安全的,会产生线程安全问题,我们可以考虑给函数加锁,但是这种方式显然会使程序效率变低,所以我们引入了双重检查即DCL懒汉式

代码说明:

  • 第一个检测对象是否为空,在里面套一个同步代码块,在同步代码块中再检测一次,这是为了防止出现多个线程几乎同时通过了第一层检测,那么他们一定会执行后面的new对象的操作,所以需要进行第二次检测
  • 在声明对象引用时,需要使用volatile关键字,这个关键字的作用是保证可见性,防止指令重排
  • 所以引出了下面的方式完成单例模式,枚举

    4.枚举

    由于枚举类先天就是线程安全,且每一个枚举类型极其定义的枚举变量在JVM中都是唯一的,正好可以用来完成单例模式,那么枚举是如何防止反射呢们可以打开反射创建的对象的源码(newInstance())看看

    5.总结

    在饿汉式和懒汉式使用时需要注意构造器私有化,防止外部访问
    懒汉式中需要注意的是,volatile关键字的使用
    在单例模式中,由于反射机制和多线程的存在枚举是最安全的,但是懒汉式和饿汉式也不是不能用,需要根据实际的情况来灵活的选择

    文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览92418 人正在系统学习中

    声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年2月28日
下一篇 2020年2月28日

相关推荐