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

  • 个税抵扣申报晚好了需要跟公司申报吗?
  • 附加税的内容有哪些
  • 什么情况要缴印花税
  • 吴中区个体户如何办理
  • 退回以前年度费用怎么做帐
  • 做账时计提费用不含税怎么取整
  • 计算产品当月生产成本
  • 住宿发票专票可抵扣吗
  • 营改增后甲供材的涉税风险
  • 股权计税成本如何计算?
  • 财务软件怎样结转销售成本
  • 收到保险公司赔款计入什么科目
  • 承包方收取分包方费用
  • 工会费用是什么意思
  • 工程发票开多了怎么办
  • 固定资产报废做账
  • 工资做账原始凭证是什么
  • 核定征收小微企业
  • 子公司注销投资收益是否纳税合并层面
  • 周转天数是越大越好吗
  • 累计已确认收入极可能不会发生重大转回
  • 成本费用怎么做分录
  • 固定资产抵扣进项
  • 继承房产再出售满五是按老证还是按新证计算时间
  • 免抵退税申报表主表
  • 出口企业出口退税
  • 企业购车按揭产生的费用
  • Win11任务栏不显示
  • 增值税一般纳税人申报流程
  • 股东投资如何做账务处理
  • 周转材料属于什么科目
  • 土地增值税怎么计算举例说明
  • PHP:Memcached::replaceByKey()的用法_Memcached类
  • PHP:pg_close()的用法_PostgreSQL函数
  • 苹果发布macOS13.3预览版
  • mmtraylsi.exe是什么进程 有什么作用 mmtraylsi进程查询
  • php curl_init
  • PHP:iconv_mime_encode()的用法_iconv函数
  • 企业所得税中的其他业务收入包括
  • 圆顶亭效果图
  • 自产自销农产品发票如何开具
  • php制作验证码
  • 房产备案交税
  • 结转制造费用的账务处理
  • 出口抵减内销产品应纳税额怎么结转
  • python颜色代码有哪些
  • 润滑油一般纳税人税率是多少
  • 销售使用过的车辆应该如何交增值税
  • mongo认证失败
  • 固定资产怎么确认价值
  • 短期投资理财是
  • 什么是符合资本化
  • 房产税从租和从价哪个税金高
  • php出现错误代码怎么办
  • 单位买理财产品怎么买
  • 按利润总额的10%怎么算
  • 增值税征收类型
  • 消费税会计处理的设置
  • 资本金利润率正常范围
  • 建筑行业会计怎么样,有前景吗
  • 银行回单太多了
  • 退休职工取暖费发放标准2023年
  • 进项发票可以退税吗
  • 短期理财收益账务分录
  • 网上认证平台进不去怎么办
  • 预付购买设备款
  • 收到货款但未开票怎么入账
  • 重装系统重启后怎么操作
  • ubuntu 4.10
  • 文科生也能看懂的电子电路学PDf
  • JavaScript中的变量名不区分大小写
  • node.js怎么创建js文件
  • Unity destructor Or OnDestory
  • 金税盘注销后怎么开发票
  • 计提税金的公式
  • 最新设立税务师事务条件
  • 居住证在粤省事怎么查询
  • 贵州税务开票系统登录
  • 12366纳税服务热线存在的问题
  • 为什么每个月总有几天
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设