网易首页 > 网易号 > 正文 申请入驻

职场提升必学设计模式!谈谈懒汉和饿汉,详解单例模式六种实现!

0
分享至

Singleton-单例模式

单例模式

  • 单例模式是一种创建模式,单例类负责自己创建自己的对象并且一个类只有一个实例对象,并且向整个系统提供这个实例.系统可以直接访问这个实例而不需要实例化
  • 单例模式的特点:单例类只有一个实例单例类必须自己创建自身的唯一实例单例类必须给其余系统对象提供创建的唯一实例

单例模式的实现方式

  • 单例模式要保证一个类只有一个实例,并且提供给全局访问,主要用于解决一个全局使用的类频繁创建和销毁的问题,通过判断系统是否存在这个单例来解决这样的问题,如果有这个单例则返回这个单例,否则就创建这个单例,只要保证构造函数是私有的即可保证一个类只有一个实例:将该类的构造方法定义为私有方法即可提供全局一个该实例的访问点:单例类自己创建实例,提供一个静态方法作为实例的访问点即可
  • 饿汉和懒汉比较:懒汉:单例类对象实例懒加载,不会提前创建对象实例,只有在使用对象实例的时候才会创建对象实例饿汉:在单例对象实例进行声明引用时就进行实例化创建对象实例
  • 单例模式除去线程不安全的懒汉,通常有五种实现方式:懒汉双检锁饿汉静态内部类枚举
  • 一般情况下,直接使用饿汉实现单例模式
  • 如果明确要求懒人加载通常使用静态内部类实现单例模式
  • 如果有关于反序列化创建对象会考虑使用枚举实现单例模式

线程不安全懒汉

  • 单例模式线程不安全懒汉Singleton示例
  • 使用了懒加载模式
  • 存在当多个线程并行调用getInstance()方法时,会创建多个实例的问题.也就是说,在多线程模式下是无法正常工作的

线程安全懒汉

  • 单例模式线程安全懒汉Singleton示例
  • 解决了在多线程环境下创建多个实例的问题
  • 存在每次获取实例都需要申请锁的问题,方法效率低下,因为在任何时候只能有一个线程可以调用getInstance()方法

双检锁

  • 双重检查锁模式:doule checked locking pattern使用同步块加锁的方法会有两次检查instance == null一次在同步块外一次在同步块内因为会有多个线程一起进入同步块外的if中如果不在同步块内不进行二次检验就会导致生成多个实例
  • 单例模式双检锁Singleton示例
  • volatile:对于计算机中的指令而言,CPU和编译器为了提升程序的执行效率,通常会按照一定的规则对指令进行优化如果两条指令互不依赖,那么指令执行的顺序可能不是源码的编写顺序形如instance = new Instance()方法创建实例执行分为三步:分配对象内存空间:给新创建的Instance对象分配内存初始化对象:调用单例类的构造函数来初始化成员变量设置instance指向新创建的对象分配的内存地址,此时instance != null因为上面的初始化对象和设置instance指向新创建的对象分配的内存地址不存在数据上的依赖关系,无论哪一步先执行都不会影响最终结果,所以程序在编译时,顺序就会发生改变:分配对象内存空间设置instance指向新创建对象分配的内存地址初始化对象CPU和编译器在指令重排时,不会关心指令重排执行是否影响多线程的执行结果. 如果不加volatile关键字,如果有多个线程访问getInstance()方法时,如果刚好发生了指令重排,可能会出现以下情况:当第一个线程获取锁并且进入到第二个if方法后,先分配内存空间,然后instance指向刚刚分配的内存地址,此时instance不等于null.但是此时instance还没有初始化完成如果此时有另一个线程调用getInstance()方法,在第一个if的判断时结果就为false,就会直接返回没有初始化完成的instance,这样可能会导致程序NPE异常使用volatile的原因是禁止指令重新排序:volatile变量进行赋值操作后会有一个内存隔离读操作不会重排序到内存隔离之中比如在上面操作中,读操作必须在执行完1,2,3或者1,3,2步骤之后才会执行读取到结果,否则不会读取到相关结果

饿汉

  • 单例模式饿汉Singleton示例
  • 优点:在单例类中,装载类的时候就创建对象实例.因为单例类的实例声明为staticfinal变量,在第一次加在类到内存中时就会初始化,所以创建实例本身时线程安全的
  • 缺点:饿汉模式不是一种懒加载模式,即便客户端没有调用getInstance()方法,单例类也会在类第一次加载时初始化使用饿汉模式创建单例类实例在某些场景中无法使用:比如因为饿汉创建的实例声明为final变量如果单例类Singleton的实例的创建依赖参数或者配置文件需要在getInstance()方法之前调用方法为单例类的实例设置参数,此时这种饿汉模式就无法使用

静态内部类

  • 单例模式静态内部类Singleton示例
  • 使用静态内部类模式创建单例类实例是使用JVM机制保证线程安全:静态单例对象没有作为单例类的成员变量直接实例化,所以当类加载时不会实例化单例类第一次调用getInstance()方法时将加载静态内部类Nest.在静态内部类中定义了一个static类型的变量instance,这时会首先初始化这个变量通过JVM来保证线程安全,确保该成员变量只初始化一次由于getInstance()方法并没有加线程锁,所以对性能没有什么影响
  • 静态内部类的优点:静态内部类Nest是私有的,只能通过getInstance()方法进行访问,所以这是懒加载的读取实例时不会进行同步锁的获取,性能较好静态内部类不依赖JDK版本

枚举

  • 单例模式枚举Singleton示例
  • 使用枚举方式实现单例的最大特点是非常简单
  • 可以通过Enum.INSTANCE来访问实例,和getInstance()方法比较更加简单
  • 枚举的创建默认就是线程安全的方法,而且能防止反射以及反序列化导致重新创建新的对象Enum类内部使用Enum类型判定防止通过反射创建新的对象Enum类通过对象的类型和枚举名称将对象进行序列化,然后通过valueOf()方法匹配枚举名称找到内存中的唯一对象实例,这样可以防止反序列化时创建新的对象

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
黑龙江庆安县警方:一辆小型客车在鹤哈高速发生单方事故,致5死12伤

黑龙江庆安县警方:一辆小型客车在鹤哈高速发生单方事故,致5死12伤

界面新闻
2024-06-30 11:59:39
《机器猫》主要人物家庭条件排名,看看谁家最有钱

《机器猫》主要人物家庭条件排名,看看谁家最有钱

坠入二次元的海洋
2024-06-30 14:46:29
Woj:托平四年6000万留守步行者

Woj:托平四年6000万留守步行者

直播吧
2024-07-01 01:48:21
萨卡踢左翼卫了!英格兰终于换人:特里皮尔伤退,帕尔默登场!

萨卡踢左翼卫了!英格兰终于换人:特里皮尔伤退,帕尔默登场!

直播吧
2024-07-01 01:37:14
国防部最新指示:全军聚焦,备战打仗,谁与争锋?

国防部最新指示:全军聚焦,备战打仗,谁与争锋?

趣说世界哈
2024-06-28 18:00:45
120万一针抗癌药,安徽首位患者治疗成功,30天肿瘤消失,值得吗

120万一针抗癌药,安徽首位患者治疗成功,30天肿瘤消失,值得吗

39健康网
2024-06-30 20:30:03
索斯盖特的阵眼?英格兰半场0-1落后,菲利普斯登上英国区热搜

索斯盖特的阵眼?英格兰半场0-1落后,菲利普斯登上英国区热搜

直播吧
2024-07-01 01:05:17
中国游客去日本狂买新三样:抛弃日本马桶盖和电饭煲...

中国游客去日本狂买新三样:抛弃日本马桶盖和电饭煲...

快科技
2024-06-28 16:36:05
湖南高速警察:只出不进!岳阳高速这些入口实行临时管制

湖南高速警察:只出不进!岳阳高速这些入口实行临时管制

潇湘晨报
2024-06-30 10:41:07
深度调查:张维为日内瓦大学亚洲研究中心“高级研究员”身份存疑

深度调查:张维为日内瓦大学亚洲研究中心“高级研究员”身份存疑

Jim博士
2024-06-30 12:32:06
还是有正义的!看了国足18强分组,足联主席“大发雷霆”公然指出

还是有正义的!看了国足18强分组,足联主席“大发雷霆”公然指出

人生趣事悟语
2024-06-30 04:15:09
再见,巴黎!6年5亿天价年薪挖角,皇马天王不去,要与姆巴佩协作

再见,巴黎!6年5亿天价年薪挖角,皇马天王不去,要与姆巴佩协作

叁炮体育
2024-06-30 15:40:10
对胡友平的感恩,挤满了日本评论区

对胡友平的感恩,挤满了日本评论区

环行星球
2024-06-29 18:57:58
俄罗斯用血的代价警示中国:一旦爆发战争,一定要牢记这三大铁律

俄罗斯用血的代价警示中国:一旦爆发战争,一定要牢记这三大铁律

花仙历史说
2024-06-30 07:57:35
霍思燕代孕女儿近照曝光!8岁女儿颜值逆天,身穿裙子戴近视眼镜

霍思燕代孕女儿近照曝光!8岁女儿颜值逆天,身穿裙子戴近视眼镜

八卦王者
2024-06-29 16:30:58
A股:重磅经济数据发布!超级赛道利空消息,下周大盘将这样运行

A股:重磅经济数据发布!超级赛道利空消息,下周大盘将这样运行

云姐财说
2024-06-30 18:07:38
美国会通过丧心病狂法案,不是支持以色列,是要置以色列于死地

美国会通过丧心病狂法案,不是支持以色列,是要置以色列于死地

战域笔墨
2024-06-30 20:06:08
7万人见证,34岁大师无法退役,4项全场第1:足坛90后第一人 !

7万人见证,34岁大师无法退役,4项全场第1:足坛90后第一人 !

风过乡
2024-06-30 08:53:43
日本公布2024年6月最受欢迎女优TOP20 森日向子美园和花入十强

日本公布2024年6月最受欢迎女优TOP20 森日向子美园和花入十强

孤独的独角兽影视
2024-06-27 09:50:02
恶心,男子入住酒店不到10小时被要求退房,前台:全广州都这样

恶心,男子入住酒店不到10小时被要求退房,前台:全广州都这样

说真话的小陈
2024-06-30 10:55:58
2024-07-01 03:04:49
攻城狮Chova
攻城狮Chova
一位攻城狮的自我修养
98文章数 28关注度
往期回顾 全部

科技要闻

河南火箭坠落爆炸?商业航天公司回应了

头条要闻

英格兰本届首次落后 施兰茨3球登顶射手榜

头条要闻

英格兰本届首次落后 施兰茨3球登顶射手榜

体育要闻

“意大利很弱”,不再是错觉了

娱乐要闻

白玉兰明星反应精彩 胡歌获奖唐嫣激动

财经要闻

A股上半年人均亏损1.2万 你亏了多少?

汽车要闻

小鹏MONA M03 7月3日首发 15万紧凑级

态度原创

亲子
本地
旅游
手机
公开课

亲子要闻

我要为自己打江山!!

本地新闻

冷知识:东北雪糕才是最早的网红雪糕

旅游要闻

突发!上海出发豪华邮轮,男子翻越栏杆后落海

手机要闻

鸿蒙生态再添新丁!神秘5G新机通过认证,距离发布不远了

公开课

连中三元是哪三元?

无障碍浏览 进入关怀版