位置: 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教程详细)

  • 购房发票契税票丢了可以补吗
  • 销售使用过的车辆
  • 记账凭证核算形式需要设置的凭证有
  • 固定资产登记在三栏式吗
  • 待处理财产损益借贷方向
  • 研发费用辅助账是什么意思
  • 应纳税所得额可以扣除哪些
  • 收到所得税退税怎么做账务处理
  • 个人所得税怎么扣
  • 分公司成立时的法人是谁
  • 企业所得税公益捐赠扣除限额
  • 委托加工的账务处理
  • 向非关联企业捐赠现金会计分录
  • 打款金额少于开票金额
  • 员工的家庭
  • 从2017年7月1日起到现在多少天
  • 一般纳税人证明在哪里打印
  • 税务局的网站以后有这些变化是你不知道的!
  • 维修服务费税率是多少?
  • 小规模季度30万免税怎么做账
  • 发放活动奖金支出怎么入账
  • 银行手续费抵扣税率是多少
  • 向投资者宣告发放股利会影响所有者权益吗
  • 服务业成本会计分析
  • mac 双系统如何调整系统空间
  • 社保生育费用报销
  • 利润总额为负数净利润怎么算
  • 代开专票计提附加税吗
  • 自己怎么做电脑系统
  • win11系统摄像头黑屏
  • 商标转让过程中公司转让
  • 个人如何办理住房贷款
  • 支付押金无法付款
  • 管家婆实物仓库怎么用
  • css字体溢出
  • php如何实现
  • 勾选确认发票后能撤销吗
  • 框架导入
  • php生成二维码海报
  • 随手写-精美笔记本-日记本安卓下载
  • lvm部署的命令
  • 微擎框架开发小程序
  • 企业注销前的账务处理
  • 公司法关于公司变更后权利义务的规定
  • 公司账号能给个人打款吗
  • 个税补缴纳
  • sqlserver 2008数据库事务日志已满怎么处理
  • 利息收入如何开票
  • 资本公积转增股本所有者权益会变吗
  • 公司报销给个人的会计分录
  • 银行承兑汇票进行贴现的会计分录
  • 出口确认收入的时间
  • 计提人工成本会计分录
  • sql server无法连接服务器的原因
  • sqlserver 断开数据库连接
  • sql提取指定字符串
  • win8无线网络连接不上
  • xp系统如何进入桌面
  • OS X 10.12.6 beta 1如何更新 OS X 10.12.6 beta 1如何升级
  • windows无法启动,可能原因
  • macza
  • win7系统共享打印机设置方法
  • winxp如何打开控制面板
  • linux关闭sh
  • linuxvi编辑器三种模式
  • Context.getExternalFilesDir()和Context.getExternalCacheDir()方法
  • unity脚本编写教程
  • javascript数学
  • linux 删除inode
  • android recyclerview 拖拽加阴影
  • 安卓网络编程面试题
  • 利用pm2部署多个设备
  • 安卓桌面照片插件
  • 爬虫如何识别验证码
  • javascript函数如何定义及其作用
  • 上海税务门户网站
  • 如何给局长送点礼品
  • 西安税务办税服务厅
  • 签订设计合同
  • 2023年车辆购置税优惠政策有哪些
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设