位置: IT常识 - 正文

设计模式——单例模式(《设计模式》)

编辑:rootadmin
设计模式——单例模式 是什么?

推荐整理分享设计模式——单例模式(《设计模式》),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:《设计模式》,设计模式 单一原则,设计模式?,设计模式 单一原则,设计模式其实很简单,设计模式简单理解,设计模式单例,设计模式 单一原则,内容如对您有帮助,希望把文章链接给更多的朋友!

单例模式是Java中最简单的设计模式之一,这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式;

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建,这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象;

结构

单例模式主要有以下角色:

1.单例类:只能创建一个实例的类;

设计模式——单例模式(《设计模式》)

2.访问类:使用单例类;

实现饿汉式

类加载就会导致该单实例对象被创建;

代码实现

我们在类加载的时候就会实例化出该对象存放在内存中,不需要在使用的时候再去创建,因此不会有多个Singleton对象实例存在,当类被卸载时,该对象也会随之消亡;

public class HungrySingleton { /** * 模拟饿汉式创建单例对象 * */ private final static HungrySingleton hungrySingleton=new HungrySingleton(); public static HungrySingleton getInstance(){ return hungrySingleton; }}懒汉式

类加载不会导致该单实例对象被创建,而是首次使用该对象的时候才会创建;

代码实现

我们直接来看最终的代码,我们不仅要在使用的时候进行单例对象的实例化,还需要防止在并发的情况下重复创建;

因此我们最终使用的方案是双重判空+锁的方式来处理,这样处理的好处就在于:如果在并发的情况下,首先回去进行非空判断,不至于让所有线程一上来就直接竞争锁资源,提高了性能,其次又为了防止在加到锁之后其他线程已经完成了实例化,因此再进行判断,这样的话更加安全和保险;

/** * 模拟懒汉式创建单例对象 * */private static volatile Singleton singleton; //防止指令重排public static Singleton getInstance() { if (singleton==null){ synchronized (Singleton.class){ //加锁防止并发的情况下重复实例化对象 if (singleton!=null){ //双重判空 return singleton; }else { singleton=new Singleton(); } } } return singleton;}

对单例对象加上volatile关键字是为了防止指令重排序,因为JVM在保证最终结果正确的情况下,可以不按照程序编码的顺序执行语句,尽可能提高程序的性能,但是这样的话就有可能报空指针异常,因此我们使用volatile修饰,可以保证其指令执行的顺序与程序指明的顺序一致,不会发生顺序变化,其次使用volatile关键字修饰的变量可以保证其内存可见性,即每一时刻读取到该变量的值都是内存中最新的那个纸,线程每次操作该变量都需要读取该变量;

如下图,如果线程A发生了指令重排,没有在第二步的时候进行对象的初始化,而这个时候线程B刚好在这个时间差去使用该对象就会报NPE异常;

本文链接地址:https://www.jiuchutong.com/zhishi/299317.html 转载请保留说明!

上一篇:第十章 STM32+ESP8266接入机智云 实现小型IOT智能家居项目(第十章光结局和夜结局)

下一篇:【Node.js实战】一文带你开发博客项目之联调(导入HTML、Nginx反向代理、CORS解决跨域、与前端联调)(node.js教程详细)

  • 印花税纳税义务人有哪些
  • 印花税科目会计分录
  • 房产税从价计征和从租怎么选择
  • 开发商交的税费是什么
  • 促销费用计入销售费用哪个科目
  • 其他应收款怎样做平
  • 信用减值损失贷方
  • 汇票和支票的区别是什么
  • 资金周转率计算公式期初占用资金
  • 外购材料费用可能计入
  • 单位买另一单位银行承兑汇怎样入账?
  • 出售旧机床的账务处理
  • 进口后的技术服务费
  • 箱包类增值税发票多少点
  • 非居民企业取得股息红利企业所得税
  • 如何防止虚开发票 等舞弊行为?
  • 财务物料消耗都有哪些
  • 金税盘用户管理是灰色不能点击
  • 劳务发票备注怎么填
  • 存货中的生产成本是指
  • 发生的费用可以直接计入主营业务成本吗
  • 差额征税预缴税额怎么算
  • 银行承兑汇票接收
  • 暂估成本比实际高分录
  • 税控服务费政策
  • 工厂院子里的地图怎么画
  • 退回的工伤费用怎么做账
  • 债转股适用范围
  • dotnetfx2.0
  • php date_diff
  • 会计学中借和贷怎么区分
  • 劳务所得和经营所得有啥区别
  • 什么情况借钱
  • 纳税人性质是什么
  • php的session和cookie实现登录
  • 【机器学习】前置知识:矩阵的表示与定义 | Identity 身份矩阵 | 逆矩阵和转置 | 标量乘法
  • 股东投资的钱要还给他吗
  • 个体双定户税率
  • 生产销售库存的会计科目
  • 本年利润贷方余额表示盈利还是亏损
  • 什么时候计提所得税费用会计分录
  • 年度利润表与12月利润表区别
  • 对公账户分类及区别
  • 出口货物申报表如何填写
  • 土地增值税清算全流程实战案例
  • 小规模当月开普票作废流程
  • 免征增值税政策的政策有哪些?
  • 营业外收入需要缴纳印花税吗
  • 房产税的计算方式
  • 行政拨款给工会的账务处理
  • 股东以固定资产投资要交增值税?
  • 公司的零星费用可以用对公转吗
  • 润滑油开具增值税专用发票
  • 资产计提减值如何进行账面记录
  • 政府补贴收入确认政策
  • 营改增一般纳税人标准
  • 高速etc里面的钱怎么取?
  • 日常修理费用如何记账
  • 科目汇总表里的应交税费
  • 期后事项的分类及处理原则
  • 会计账簿按外表可分为
  • 阿拉伯数字转大写函数
  • MySQL利用命令行工具启动和关闭的命令是什么
  • DBCC CHECKIDENT 重置数据库标识列从某一数值开始
  • win8系统手机
  • Xp系统的桌面文件在哪里
  • centos查找目录命令
  • securecrt keymap
  • window8系统安装步骤
  • windows7开始菜单设置在哪里
  • gnome版本
  • linux修改22端口号
  • 电脑windows8怎么样
  • nodevideo翻译
  • div li
  • linux版本控制软件
  • shell脚本实际运用
  • python ping检测
  • 上海电子发票试点
  • 怎样在江苏智慧人社上停保
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设