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

  • 个体户转到个人要多少税
  • 房产契税是怎样计算的
  • 发票抬头开个人可以吗
  • 购买的固定资产什么时候折旧
  • 费用报销哪些可以不用合同的
  • 小规模纳税人减半征收
  • 转让财产收入征税吗
  • 工业会计成本核算分录
  • 垫付的医疗费保险多久可以报销
  • 出差人员报销差额怎么算
  • 小规模发票跨月冲红怎么做账
  • 企业生产设备发生的日常维修费用
  • 往来核算会计的岗位职责和工作内容
  • 增值税专票销货清单模板
  • 馒头税率是9么
  • 快递费税率为什么是9
  • 减税降费各项政策
  • 税款流失是什么意思
  • 车船税为什么没有优惠
  • 天猫店不开发票会被扣多少分
  • 现金流量表本月数和本年累计数是相等的么
  • 代收代付水电费会计分录
  • 结汇汇兑损益账务处理
  • 微小企业每个季度减免多少税
  • 企业收到税前投资分红如何缴纳增值税?
  • 按产品的品种型号规格规定的计划
  • 建筑企业分包工程的纳税人
  • 买点肥料
  • 购买办公桌会计分录
  • 超市预售卡怎么记账
  • linux的vi编辑器怎么用
  • php字符串操作函数
  • 销售折扣的会计分录处理
  • 行政事业单位会计职责
  • 工资储备金制度
  • css 100vw、100vh出现滚动条怎么解决
  • 个体工商户属于灵活就业人员吗
  • 固定资产原值怎么确定
  • 业务招待费可以结转以后年度扣除吗
  • 总公司不是小微企业,分公司独立核算的
  • 个体开发票额度
  • 公司的车的停车费谁出
  • 应收利息可以计入其他应收款吗
  • 解决掉发的有效方法
  • 软件服务费可以全额抵扣吗?
  • 以发行股票作为对价取得企业的股权
  • 企业每月应交哪几种税费
  • 增值税电子普通发票和专票的区别
  • 罚款支出计入什么费用
  • 应交企业所得税是什么科目
  • 员工意外伤害险入什么会计科目
  • 有形动产租赁服务属于现代服务吗
  • 上市公司回购股票多久可出售
  • 如果返利冲抵货款怎么办
  • 利润是用含税价还是去税价
  • 实缴出资未注明投资款
  • 过程中必须有哪两种状态
  • 车辆购置税的税目有哪些
  • 售楼部装修费计入什么科目
  • 减免税款属于政府补助利得吗
  • sql server.
  • 在苹果电脑mac上怎么下载
  • win8本地账户
  • win8的显示设置
  • 个人pc用户免费下载软件
  • 使用jquery
  • sed配合grep
  • linux里面vim
  • 安卓机的返回键
  • javascript如何
  • nodejs socket框架
  • JavaScript中Number.MIN_VALUE属性的使用示例
  • javascriptprompt用法
  • andorids
  • python paramiko模块 判断过期
  • JS Timing
  • 简述javascript中的函数
  • jquery mobile 加载页面
  • 没工作个人所得税还用下载吗
  • 国家税务总局电话人工客服
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设