找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 226437|回复: 12

Java程序员必备:设计模式-单例模式

[复制链接]

该用户从未签到

发表于 2020-7-6 01:27:07 | 显示全部楼层 |阅读模式

您需要 登录 才可以下载或查看,没有账号?立即注册

×
一、简介

单例模式,Singleton , Java 23 设计模式中创建型模式之一, 该模式定义为:一个类只有一个实例,且该类能自行创建这个实例的一种模式。其主要特点为:单例类有且只有一个对象 对象必须由单例类自行创建(其实一些业务层框架(例如Spring) 中的对象默认也是单例的) 单例类对外提供一个访问该单例的全局访问方式二、实现方式

单例模式是所有设计模式中几乎最简单的一个。其实现方式主要包括两种:懒汉式 饿汉式 每一种实现方式有各有优缺点,咱们来看下三、饿汉式

                               
登录/注册后可看大图


饿汉式, 在声明对象属性的同时初始化属性,这样做的优点是, 不会出现任何多线程下的线程安全问题, 缺点也很明显, 没有实现 Lazy Initialize (延迟加载,在使用该对象时才创建之)。如果这个对象在整个JVM运行过程中一直不使用, 该对象也需要 “ 常驻内存 ” 四、懒汉式


                               
登录/注册后可看大图
懒汉式 解决了 饿汉式的 延迟加载 问题, 但是, 随之也出现了更加严重的 线程安全问题。在多线程下, 可能会出现多个对象 (线程A 进入 if , CPU 时间片分配给 线程B , 线程B 也进入if , 同时创建instance 对象。此时,线程A 重新获得 CPU 使用权, 继续创建 instance 对象,从而出现了多个对象 )。
五、懒汉式 - 线程安全版


                               
登录/注册后可看大图

代码中加了 synchronized 同步锁, 保证了多线程下的安全性, 但是, 效率实在是太低!
六、懒汉式 - DC 模式


                               
登录/注册后可看大图
为了提高效率, 对代码从以下两个方面进行了优化:

去掉方法同步的关键字synchronized,对Singleton.class进行加锁操作, 降低锁的粒度, 减少系统开销 使用 DC ( Double Check )。即 对于 instance对象 进行 两次 空值 检测。 如果对象不为空, 则不需要重新获取对象锁。七、懒汉式 - volatile

感觉到了 DC 部分已经很完善了, 万无一失!但是, 很遗憾, DC 模式下 也不是绝对的安全, 这次不是出现多个对象, 而是可能会出现 半个 对象的情况, 因为: 对象的创建过程不是原子的! 也就是说在对象创建 “一半” 的时候可能就会被另一个线程 “ 返回 ”。 从而出现bug。所以, 完善后的代码为:

                               
登录/注册后可看大图
版权声明:本文为CSDN博主「CoWitoSug」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:http://blog.csdn.net/JAVA_C90/article/details/107071874
回复

使用道具 举报

该用户从未签到

发表于 2020-7-6 01:59:17 | 显示全部楼层
支持!!!
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2020-7-6 01:59:18 | 显示全部楼层
非常好!!
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2020-7-6 01:59:24 | 显示全部楼层
你历害!!
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2020-7-6 01:59:36 | 显示全部楼层
转发了!!
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2020-7-6 01:59:37 | 显示全部楼层
你好棒!!
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2020-7-6 01:59:48 | 显示全部楼层
沙发!!
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2020-7-6 01:59:54 | 显示全部楼层
顶一下!!
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2020-7-6 01:59:52 | 显示全部楼层
赞!赞!!
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2020-7-6 01:59:57 | 显示全部楼层
不错呀!!
回复 支持 反对

使用道具 举报

网站地图|页面地图|Archiver|手机版|小黑屋|找资源 |网站地图

GMT+8, 2025-5-22 00:16

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表