最新要闻
- 辅助工具管理器_辅助工具管理器-焦点关注
- 东莞一锂电池厂深夜大火:照亮整个天空 无人伤亡
- 部分男厕改女厕引不满 四川大学再回应:进一步完善优化
- 汶川地震15周年 微信地震预警功能四川上线:秒级预警
- 世界今热点:《庆余年2》海报疑似抄袭 海报设计公司致歉
- 别说“刹车失灵”了!特斯拉回应大规模召回:降低交通事故概率
- 【天天热闻】4月MPV销量排名出炉 别克GL8大战腾势D9 受伤的是五菱宏光
- 0糖0脂 清新甜润:平仄青柑乌龙茶12瓶39元
- 自研半固态技术!蔚来1000公里续航车型申报:比宁王麒麟电池还猛 世界热头条
- 特斯拉FSD再不来真没机会了 比亚迪出手:智能驾驶年内上车 每日快报
- 榴莲涨到39.9元/斤 网友直呼吃不起 盒马回应:货源少了
- 环球热资讯!被任天堂拉黑媒体发声:有人给《塞尔达传说:王国之泪》打6分很好
- 世界今日报丨法拉第晒财报 贾跃亭真成了!FF:已生产40辆FF91 百万豪车买不买?
- 世界热头条丨OPPO终止ZEKU芯片业务:这是一个艰难的决定!
- 天天看热讯:OPPO终止自研芯片业务!小米王化:确实不容易
- 哪吒汽车CEO:电吸门是脑残无用设计 出门基本不动手的人才用-当前速看
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
Java设计模式【单例模式】 当前速读
Java设计模式【单例模式】
单例模式
单例模式(Singleton Pattern)是一种创建型设计模式,其主要目的是确保一个类只有一个实例,并提供对该实例的唯一访问点。
优缺点
优点
:
提供了对唯一实例的受控访问。
(资料图片)
由于在系统内存中只存在一个对象,因此可以节约系统资源。
缺点
:
单例类的扩展有很大的困难。
单例类的职责过重,在一定程度上违背了“单一职责原则”。
对象生命周期。 单例模式没有提出对象的销毁,在提供内存的管理的开发语言中,只有单例模式对象自己才能将对象实例销毁,因为只有它拥有对实例的引用。 在各种开发语言中,比如C++,其他类可以销毁对象实例,但是这么做将导致单例类内部的指针指向不明。
单例模式的使用
饿汉模式
- 静态成员变量
/** * @author Physicx * @date 2023/5/12 下午10:13 * @desc 单例 * Created with IntelliJ IDEA */public class Singleton { //初始化实例对象 private static final Singleton instance = new Singleton(); //私有化构造方法 private Singleton() { } //提供获取实例对象方法 public static Singleton getInstance() { return instance; }}
- 静态代码块
/** * @author Physicx * @date 2023/5/12 下午10:13 * @desc 单例 * Created with IntelliJ IDEA */public class Singleton { //实例对象 private static final Singleton instance; static { instance = new Singleton(); } //私有化构造方法 private Singleton() { } //提供获取实例对象方法 public static Singleton getInstance() { return instance; }}
饿汉式单例的写法适用于单例对象较少的情况,这样写可以保证绝对的线程安全,执行效率比较高。但是缺点也很明显,饿汉式会在类加载的时候就将所有单例对象实例化,这样系统中如果有大量的饿汉式单例对象的存在,系统初始化的时候会造成大量的内存浪费,换句话说就是不管对象用不用,对象都已存在,占用内存。
懒汉模式
public class Singleton { //实例对象 private static Singleton instance; //私有化构造方法 private Singleton() { } //提供获取实例对象方法(线程安全) public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; }}
线程安全的一种懒汉式写法,在类第一次使用的时候初始化,获取实例的静态方法由synchronized修饰,所以是线程安全的。这种方法每次获取实例对象都加锁同步,效率较低。
双重检测机制(DCL)
public class Singleton { //实例对象 private static volatile Singleton instance; //私有化构造方法 private Singleton() { } //提供获取实例对象方法 public static Singleton getInstance() { if (instance == null) { //加锁处理 synchronized (Singleton.class) { if (instance==null) { //初始化 instance = new Singleton(); } } } return instance; }}
实例对象必须用 volatile
修饰,否则极端情况可能出现安全隐患。
以上初始化对象代码被编译后会变成以下三条指令:
分配对象的内存空间。
初始化对象。
设置instance指向刚才分配的内存空间。
如果按照上面的执行顺序则不加volatile没有问题,但是CPU或编译器为了提高效率,可能会进行指令重排,最终顺序变为:
分配对象的内存空间。
设置instance指向刚才分配的内存空间。
初始化对象。
当两个线程同时获取实例对象时,线程A已经将instance指向分配空间但未初始化对象,线程B此时第一次判空已不为空,于是返回instance实例,但是此时返回的实例未初始化会导致后续空指针异常。
DCL这种方式同样也是类第一次使用的时候初始化,初始化代码synchronized修饰线程安全,这种方式只会第一次实例对象才会进行同步,因此效率高。
《Java Concurrency in Practice》作者Brian Goetz在书中提到关于DCL的观点:促使DCL模式出现的驱动力(无竞争同步的执行速度很慢,以及JVM启动时很慢)已经不复存在,因而它不是一种高效的优化措施。延迟初始化占位类模式(静态内部类)能带来同样的优势,并且更容易理解。
静态内部类(延迟初始化)
public class Singleton { //私有化构造方法 private Singleton(){} //静态内部类(被调用时加载) private static class SingletonHandle { private static final Singleton instance = new Singleton(); } //提供获取实例对象方法 public static Singleton getInstance() { return SingletonHandle.instance; }}
利用静态内部类被调用时才加载的特性,通过静态初始化初始Singleton对象,由于JVM将在初始化期间获得一个锁,并且每个线程都至少获取一次这个锁以确保这个类已经加载,因此在静态初始化期间,内存写入操作将自动对所有线程可见。因此无论是在被构造期间还是被引用时,静态初始化的对象都不需要显式的同步。
线程安全,效率高,使用的时候才会初始化不浪费内存。
《Java Concurrency in Practice》作者Brian Goetz 推荐这种单例实现方式。
枚举实现方式
除了以上几种常见的实现方式之外,Google 首席 Java 架构师、《Effective Java》一书作者、Java集合框架的开创者Joshua Bloch在Effective Java一书中提到:单元素的枚举类型已经成为实现Singleton的最佳方法。
在这种实现方式中,既可以避免多线程同步问题;还可以防止通过反射和反序列化来重新创建新的对象。
public class Singleton { //私有化构造方法 private Singleton() {} enum SingletonEnum { SINGLETON; private final Singleton instance; SingletonEnum() { instance = new Singleton(); } //提供获取实例对象方法 public Singleton getInstance() { return instance; } }}
调用方式如下:
public static void main(String[] args) { Singleton instance1 = Singleton.SingletonEnum.SINGLETON.getInstance(); Singleton instance2 = Singleton.SingletonEnum.SINGLETON.getInstance(); System.out.println(instance2 == instance1); }
普通的单例模式是可以通过反射和序列化/反序列化来破解的,jvm虚拟机会保证枚举类型不能被反射并且构造函数只被执行一次,而Enum由于自身的特性问题,是无法破解的。当然,由于这种情况基本不会出现,因此我们在使用单例模式的时候也比较少考虑这个问题。
总结
实现方式 | 优点 | 缺点 |
---|---|---|
饿汉模式 | 线程安全,效率高 | 非懒加载 |
懒汉模式 | 线程安全,懒加载 | 效率低 |
双重检测机制 | 线程安全,懒加载,效率高 | |
静态内部类 | 线程安全,懒加载,效率高 | |
枚举 | 线程安全,效率高 | 非懒加载 |
由于单例模式的枚举实现代码比较简单,而且又可以利用枚举的特性来解决线程安全和单一实例的问题,还可以防止反射和反序列化对单例的破坏,因此在很多书和文章中都强烈推荐将该方法作为单例模式的最佳实现方法。
参考:单例模式详解(知乎文章)
设计模式相关其他文章:Java设计模式总结
关键词:
-
【新华500】新华500指数(989001)12日收跌1.31%_每日消息
新华500指数(989001)12日收盘跌1 31%,报4331 91点。指数盘中最高触及4398 08点,最低触及4331 23点,成
来源: Java设计模式【单例模式】 当前速读
【新华500】新华500指数(989001)12日收跌1.31%_每日消息
辅助工具管理器_辅助工具管理器-焦点关注
东莞一锂电池厂深夜大火:照亮整个天空 无人伤亡
部分男厕改女厕引不满 四川大学再回应:进一步完善优化
汶川地震15周年 微信地震预警功能四川上线:秒级预警
世界今热点:《庆余年2》海报疑似抄袭 海报设计公司致歉
别说“刹车失灵”了!特斯拉回应大规模召回:降低交通事故概率
环球热文:PTP主时钟(时间同步装置)是怎样实现时钟同步的?
MSCI中国指数季度调整出炉 新纳入53只标的|全球速看料
【天天热闻】4月MPV销量排名出炉 别克GL8大战腾势D9 受伤的是五菱宏光
0糖0脂 清新甜润:平仄青柑乌龙茶12瓶39元
自研半固态技术!蔚来1000公里续航车型申报:比宁王麒麟电池还猛 世界热头条
特斯拉FSD再不来真没机会了 比亚迪出手:智能驾驶年内上车 每日快报
榴莲涨到39.9元/斤 网友直呼吃不起 盒马回应:货源少了
袋鼠云产品功能更新报告05期|应有尽“优”,数栈一大波功能优化升级!
环球快报:易基因:DNA甲基化和转录组分析揭示野生草莓干旱胁迫分子调控机制|植物抗逆
今日讯!NES 系统架构
环球热资讯!被任天堂拉黑媒体发声:有人给《塞尔达传说:王国之泪》打6分很好
世界今日报丨法拉第晒财报 贾跃亭真成了!FF:已生产40辆FF91 百万豪车买不买?
三次输错密码后,系统是怎么做到不让我继续尝试的?|全球短讯
在C#中使用默认值初始化字符串数组的3种方式
世界热头条丨OPPO终止ZEKU芯片业务:这是一个艰难的决定!
天天看热讯:OPPO终止自研芯片业务!小米王化:确实不容易
哪吒汽车CEO:电吸门是脑残无用设计 出门基本不动手的人才用-当前速看
又菜又爱玩 加塞不成一路别车:结局笑出了声!|最新资讯
天天视点!签约保底要400万?孟羽童回应董明珠给百万年薪:在格力月薪没过万 工作21小时
环球头条:开源.NetCore通用工具库Xmtool使用连载 - 随机值篇
JDK8 新特性之新的日期&时间API,一篇讲清楚!
智能化生产应用搭建的实战案例 世界微头条
精彩看点:echarts的散点图和中国地图配合使用
【经验分享】最新Microsoft Edge Dev游览器游览Flash网页的办法_今日聚焦
iPhone/iPad全系可用:闪魔MFi苹果认证线21.8元大促 世界简讯
4月轿车销量排名出炉 燃油车新能源“混战” 好戏即将开场
环球时讯:某日系车一把手摊牌了:现在最害怕比亚迪
格局有了!SteamDeck官方庆祝ROG Ally开卖
精彩看点:深圳某公司母亲节放假3天不调休:和妈妈度过完整的母亲节
驾特斯拉遭遇车祸后 林志颖现身珠海首次参加赛车比赛:状态良好
战斗力爆表!无人机航拍时被鹰叼走:画面剧烈晃动
高通骁龙8 Gen2下放!一加Ace2 Pro曝光
曾盛赞比亚迪股票的巴菲特又减持了!本人回应:不想跟马斯克的特斯拉竞争
不止安装失败!Win11 KB5026372更新出现诸多问题 天天观天下
当前短讯!【转】为什么 TCP 建立连接需要三次握手
快看:Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试
Java设计模式-适配器模式
“原神玩家”和“塞尔达玩家”打起来了?不过是恶臭互联网的又一次狂欢_世界新消息
别了机械硬盘?全固态玩家转向了当“垃圾佬”
全系2.0T+8AT比BBA香多了!新款林肯冒险家上市:24.58万起
环球即时看!最大96GB内存不是梦!笔记本将迎来单条48GB DDR5内存
7499元 华硕天选4R游戏本上架:锐龙7-7735H、165Hz高刷
取代C++!微软改用Rust语言重写的Win11内核:正式来了
中药成香饽饽! “药茅”片仔癀20年涨价18次 专家称没病别跟风买_全球快资讯
多省加入封杀行列!老头乐销冠雷丁汽车申请破产 创始人被曝身居海外
SSD能有多便宜:2TB新品不到700元!长江存储232层原片颗粒加持
全球微资讯!Windows7 上运行docker实战
4月份以来17家银行下调存款利率 有望助推债市继续走牛 聚焦
美债上限谈判无进展 债务违约风险加大-环球速讯
沙特等减产石油 美国被逼补库存:印度捡漏俄油占大便宜 2022年省下50亿美元
当前资讯!国内第一!深圳要打造5G-A之城 全市5G网速平均必500Mbps 上行下载更狠
焦点热议:1000W用户1Wqps高并发签到系统的架构和实操
学系统集成项目管理工程师(中项)系列21a_整体管理(上)
长沙霸占车位车主致歉 栏杆拆除:双方均再次道歉 从没想会被网暴-环球今亮点
众望所归!马斯克宣布卸任推特CEO:神秘女子将接班
狗狗失踪7年后回家 主人煮饺子庆团圆:网友感慨万物皆有灵
IGN 10分新神作!《塞尔达传说:王国之泪》港服日服已正式解锁
热消息:刘强东真兄弟!20年投入员工福利近500亿、建设公寓2.5万套
【天天播资讯】百度的“New Bing”终于来了!但别高兴得太早
全球看热讯:苹果年度跳水王!M2版Mac mini降到3399元了:不用领券
当前动态:Python学习之二:不同数据库相同表是否相同的比较方法
中芯国际人事再变动 刘训峰担任副董事长:基本年薪334万元 世界信息
性能逼近PS5 ROG掌机正式发布:首发锐龙Z1处理器 畅玩3A大作-天天观速讯
两个妈妈!英国首批三亲婴儿诞生:体内有三个人的DNA
[Linux] 如何查看Centos用户登陆记录?[转载]_全球即时
今日热讯:【财经分析】REITs二级市场止跌回稳 机构看好高速板块后续表现
5月26日上映!迪士尼《小美人鱼》内地版配唱阵容官宣:黄绮珊领衔 短讯
环球今亮点!任天堂《塞尔达传说:王国之泪》获超低评分:太复杂玩不进去
司机400升油箱加到430升仍没加满:费用近3000元 已向多部门举报|看热讯
打开PDB报错ORA-30013
曝APP停摆、发不出工资 爱驰汽车再渡劫-每日短讯
当前快播:兆易创新首发Arm Cortex-M7内核MCU:600MHz超高频率!性能暴涨40%
《塞尔达传说:王国之泪》评分公布!IGN无悬念打出10分满分-新资讯
视点!高叶祝张颂文福如东海寿比南山:晒吃面照庆生
中芯国际发布Q1财报:利润下滑44% 尚未看到市场回暖 焦点日报
S5PV210 | 微处理器启动流程
P3723 [AH2017/HNOI2017]礼物(FFT)
益科正润:美国债务违约倒计时,“去美元化”正当时
【财经分析】土总统埃尔多安寻求连任面临挑战_环球新消息
难怪叶二娘要勾引虚竹的父亲,你看幕后黑手是谁?叶二娘喊他哥哥_前沿资讯
当前热讯:一颗巨型小行星正飞速靠近地球 网友:赶紧来撞我
今天开始 谷歌搜索大变样了:AI接管 焕然一新_环球视讯
同程酒店订单“订后即焚”功能引热议 网友:这是要防谁?
前方畅通日产轩逸频刹车减速 本田飞度看不下去:右侧也要超过去
农村母女嫌路边冷藏车太吵 要求关掉制冷机未果 一砖砸碎车玻璃-当前热文
ChatGPT 再遭禁用 | 人工智能时代下数据安全如何保障
Spring MVC官方文档学习笔记(一)之Web入门
当前报道:python 多进程jieba分词,高效分词,multiprocessing
277米!华为WATCH Ultimate非凡大师助力 潜水员韩颋再创亚洲洞穴潜水记录
不想做“四眼仔”!怎样科学使用电子产品?这4点学起来
环球速看:“男生减速带”视频为什么能爆红?抖音科普
海信手机天猫旗舰店停运:页面显示“店铺终止经营公告”-世界看点