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

  • 小饭店税务登记证办理流程
  • 报税以及注销公司的注意事项?
  • 增值税小规模纳税人免征增值税政策
  • 一般纳税人购买二手车可以抵扣嘛
  • 缴纳上个月增值税要先计提吗
  • 完税证明可以重复打印吗
  • 咨询费计入什么管理费用的什么科目
  • 无销项税额
  • 怎样查是否为一类银行卡
  • 连号发票不许报销的具体发票类型
  • 支付的保证金
  • 应交税金的期末余额怎么算
  • 预付房租摊销账务处理
  • 租赁公司扣押金
  • 企业计提福利费时,贷记应付职工薪酬
  • 自产产品销售增值税
  • 新租赁准则承租人进项税
  • 商会会费收入要交所得税吗
  • 企业网银使用
  • 企业所得税能否核定征收
  • 企业收到固定资产投资时应按什么入账
  • 预付账款怎么做账
  • 费用已付款未收到发票需要暂估入账吗
  • 此次新政策对原来就是小型微利企业的纳税人有影响吗?
  • 免税的普通发票怎么开
  • 付款交单和承兑交单对卖方来说都有一定风险
  • html前端技术
  • 购买土地前期费用怎么入账
  • 发票开出后只收到部分款怎么处理?
  • 企业所得税汇算清缴调增的项目有哪些
  • 代理 linux
  • 售后租回融资租赁帐务处理怎么做?
  • 购买电子承兑需要给对方开发票吗
  • 努沙杜瓦酒店
  • 完美解决在ThinkPHP控制器中命名空间的问题
  • 哪些收入不列入交纳党费计算基数
  • php页面刷新代码
  • 加计抵减是适用什么税率
  • 若依和pig
  • 前端使用vue
  • vue前端面试官常问的问题
  • php 遍历字符串
  • 11-ElementUI
  • mysql视图菜鸟教程
  • 企业购买国债逆回购怎么操作
  • 公司汽车租赁开什么税目
  • 生产成本直接人工怎么算
  • 商业承兑汇票如何开具
  • 小规模纳税人申报增值税的操作流程
  • 建账初期账务处理程序
  • xp系统每次开机都重启
  • windows xp的设备管理器在哪
  • win10蓝屏后黑屏
  • 在linux2.4.0版本中
  • centos 安装chia
  • linux用中文怎么说
  • 苹果电脑装win7键盘无法使用
  • win10一年更新几次
  • magento开发教程
  • w1020h2更新失败
  • linux定时任务实现原理
  • win7怎样安装adb工具
  • opengl实现光照效果
  • jQuery实现两个下拉列表关联
  • nodejs内置的包管理器
  • python中requests小技巧
  • 炉石传说架是什么意思
  • Do All in Cmd Shell一切在命令行下完成第1/6页
  • javascript module
  • python怎么弄中文
  • javascript随机生成数字
  • Python 使用requests模块发送GET和POST请求的实现代码
  • 欢迎使用来电提醒业务是什么意思
  • javascript面向对象编程
  • jqueryw3c
  • jquery字体设置
  • 如何理解税收的本质
  • 季报逾期申报怎么写
  • 西安车辆购置税缴纳需要什么材料
  • 新市税务所电话
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设