1.什么是单例模式?

当我们new一个对象时会帮我们申请内存地址,每一次去new的时候都会构建不同的地址,而单例模式就是每次获取的实例化对象都保证是同一份。常见的单例模式有8种写法,每一种单例模式都有自己的优缺点,下面让我们来看看这8种单例模式。

1.饿汉模式(推荐)

优点:当类加载到内存后就实例化一个单例,由Jvm保证线程安全,写法超级简单;实际开发中也不会在意是否一定要使用了才进行加载。

缺点:可通过反射和反序列化进行更改,不管是否使用,只要类加载时就会完成实例化。

2.饿汉模式变形(推荐)

这种方式实际上只是饿汉模式的一种变形写法,加载类时由于只会执行一次静态代码块来初始化实例。

3.懒汉模式写法1(不推荐)

优点:解决了只有在使用时才进行实例化单例

缺点:可通过反射和反序列化进行更改,不能多线程环境下使用,线程不安全,当存在多线程环境下时,若第一个线程进入判断singleton为null,当还未进行初始化单例对象时,第二个线程此时判断singleton也为空,所以会继续进行初始化单例对象,此时两次返回的单例实际上并不是同一个。

4.懒汉模式写法2(不推荐)

优点:解决了只有在使用时才进行实例化单例,同时保证线程安全。

缺点:可通过反射和反序列化进行更改;通过对方法上进行synchronized关键字进行加锁,但是由于锁的力度过大,每次都需要进行加锁,即使singleton已经不为空时。

5.懒汉模式写法3(不推荐)

优点:解决了只有在使用时才进行实例化单例

缺点:可通过反射和反序列化进行更改,线程不安全,多线程环境下使用时,若第一个线程进入判断singleton为null,然后拿到锁,当还未进行初始化单例对象时,第二个线程此时判断singleton也为空,所以会继续进行初始化单例对象,此时两次返回的单例实际上并不是同一个。

6.懒汉模式DCL(推荐

优点:解决了只有在使用时才进行实例化单例,线程安全,需要注意的是成员变量singleton必须加volatile关键字,防止指令重排序。

缺点:可通过反射和反序列化进行更改。

7.静态内部类(推荐

优点:解决了只有在使用时才进行实例化单例,线程安全,这种方式跟饿汉式方式采用的机制类似,但又有不同。两者都是采用了类装载的机制来保证初始化实例时只有一个线程。不同的地方在饿汉式方式是只要Singleton类被装载就会实例化,而静态内部类的是调用getInstance时才会加载。

缺点:可通过反射和反序列化进行更改。

8.枚举单例(推荐)

枚举单例是出自Effective Java的作者,利用JDK枚举的特性进行实现的。

优点:解决了只有在使用时才进行实例化单例,线程安全,同时不能够被反序列化,以及利用反射进行破坏。

缺点:确实没什么缺点,唯一的缺点就是看着有点奇怪~

有什么问题,扫码关注我的微信公众号第一时间联系到我。同时可以第一时间收到我的原创文章

聊聊这8种单例模式的优缺点相关推荐

  1. IOS单例模式及单例模式的优缺点

    单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. #import <Foundation/Foundation.h&g ...

  2. 单例模式的优缺点和使用场景

    单例模式的优缺点和使用场景 文章转自:http://www.tools138.com/create/article/20150929/020009847.html 单例模式的优缺点和使用场景 - 晓明 ...

  3. iOS开发笔记-两种单例模式的写法

    iOS开发笔记-两种单例模式的写法 单例模式是开发中最常用的写法之一,iOS的单例模式有两种官方写法,如下: 不使用GCD #import "ServiceManager.h"st ...

  4. LVS Nginx HAProxy 三种负载均衡优缺点比较

    搭建负载均衡高可用环境相对简单,主要是要理解其中原理.此文描述了三种负载均衡器的优缺点,以便在实际的生产应用中,按需求取舍. 目前,在线上环境中应用较多的负载均衡器硬件有F5 BIG-IP,软件有LV ...

  5. 【面试系列】6种单例模式(Singleton)实现方法比较

    转载文章,文章经 LiteCodes 授权,转载至本博客. 原文地址:[面试系列]6种单例模式(Singleton)实现方法比较 下述代码均省略了 Singleton 类的业务代码段,仅表现作为单例所 ...

  6. css实现三栏布局的几种方法及优缺点

    三栏布局,顾名思义就是两边固定,中间自适应. 三栏布局在实际的开发十分常见,比如淘宝网的首页,就是个典型的三栏布局:即左边商品导航和右边导航固定宽度,中间的主要内容随浏览器宽度自适应. 我们不妨假定这 ...

  7. java两种绑定方式_java两种单例模式用法分析

    本文实例讲述了java两种单例模式用法.分享给大家供大家参考,具体如下: 按照加载方式的不同,单例模式有两种实现: private:只能在同一个类中使用 static:该类是类方法,不能调用实例方法. ...

  8. MySQL、SqlServer、Oracle 三种数据库的优缺点总结

    MySQL.SqlServer.Oracle 三种数据库的优缺点总结 一.MySQL 二.SqlServer 三.Oracle 一.MySQL 优点: 体积小.速度快.总体拥有成本低,开源: 支持多种 ...

  9. Java单例模式详解--七种单例模式实现+单例安全+实际应用场景

    单例模式 保证了一个类只有一个实例,并且提供了一个全局访问点.单例模式的主要作用是节省公共资源,方便控制,避免多个实例造成的问题. 实现单例模式的三点: 私有构造函数 私有静态变量维护对象实例 公有静 ...

最新文章

  1. mysql的配置和启动命令
  2. Android Activity/Fragment间的数据传递
  3. vue模板html,VueJS模板
  4. 在浏览器控制台执行以下代码,输入的结果是()
  5. storyboard隐藏iphone软键盘
  6. MySql创建一个存储过程
  7. RDLC报表下载的权限问题
  8. 月薪30K程序员花了一个小时,用c++做出经典扫雷游戏 !
  9. ORA-00997: 非法使用 LONG 数据类型
  10. oracle10g生成awr报告,oracle 10g awr报告生成步骤及awr报告分析
  11. C#泛型学习实例(简单易懂)
  12. C++ container member map
  13. List 集合排序 降序升序
  14. 基于html5的网上订餐系统,基于WEB的网上订餐系统-任务书.doc
  15. 浏览器通过域名查找IP地址的过程
  16. gitlab代码提交自动触发Jenkins token发版(二)
  17. Google Cloud Platform免费申请试用后结算账号(Billing Account)自动关闭,不能开启的问题
  18. 十年Java经验让我总结出了这些,什么是真正的架构设计?
  19. 文本的检测、识别实战:使用 Tesseract 进行 OpenCV OCR 和文本识别
  20. qt tablewidget中item添加背景色

热门文章

  1. java计算机毕业设计-数字相册管理系统-源码+数据库+系统+lw文档+mybatis+运行部署
  2. 2022 3.17网易互娱研发岗笔试题锯齿数独题解
  3. 周报|吉吉拍APP正式上架应用宝
  4. 计算机在未来医学中的应用,【-通信传播论文:计算机技术在医学中的应用材料】...
  5. 类似苹果数据线的android,除了常见的安卓、苹果、Type-c,还有哪些你不知道的手机数据线?...
  6. 量子力学之电子自旋与四个量子数
  7. 基于Matlab的压力控制论文,基于Matlab的压力容器螺栓组联接优化设计的论文
  8. GitHub中开启二次验证Two-factor authentication,如何在命令行下更新和上传代码
  9. A站APP acfun APP产品体验报告
  10. Java实现比较APP版本号大小