位置: 编程技术 - 正文

Android设计模式之单例模式 Singleton(android设计模式的应用场景)

编辑:rootadmin
一.概述单例模式是设计模式中最简单的一种,但是它没有设计模式中的那种各种对象之间的抽象关系,所以有人不认为它是一种模式,而是一种实现技巧.单例模式就像字面的意思一样,提供一个只能自己实例化的实例,并且提供了一个全局的访问点.要达到这几点要求就要满足三点:私有构造函数(防止被别人实例化),静态私有自身对象(用来提供实例),静态公有的getInstance方法(用来创建和获取实例对象).优缺点:单例只允许自己建立一个实例,不需要频繁创建和销毁,可以节省内存加快对象的访问速度.但是单例没有抽象层和借口,不方便扩展.单例既提供工厂方法又提供业务方法,一定程度上违背了单一职责原则二.单例实现

推荐整理分享Android设计模式之单例模式 Singleton(android设计模式的应用场景),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:android设计模式书籍,android设计模式的应用场景,android设计模式的应用场景,android设计模式总结,android设计模式与最佳实践 pdf,android设计模式面试题,android设计模式面试题,android设计模式面试题,内容如对您有帮助,希望把文章链接给更多的朋友!

单例的实现有两个主流方式,分别是懒汉模式和饿汉模式,他们在实例化的时机和效率方面各有不同

1.懒汉模式

懒汉模式在外部对象每次获取实例时都要先判断该实例是否被初始化,这点相比饿汉模式来说就会损失一些效率,但是会节省一些空间,因为什么时候用到该实例才会去初始化,如果一直用不到的话,在懒汉模式里面时不会构造该对象的.相当于用空间换时间.也就是延迟加载技术.还有一点需要注意的是一定要有私有构造,要不然外部对象还是可以实例化该对象,那还谈何单例.

这个时候很多小伙伴要说了,你这个懒汉单例有问题,有线程安全问题.当然这个方式是线程不安全的,当两个线程A和B并发要获取实例的时候,instance还没有被初始化,假设A先拿到时间片去初始化instance,当instance还没有初始化完成的时候,时间片让给了B,这时由于instance还没有被初始化完成那么instance还为空,所以B还会去把instance实例化一次,最终的结果就是instance被实例化了两次.这可能会造成很严重的后果,解决方式就是加锁(牺牲一些性能),使用饿汉模式.

Android设计模式之单例模式 Singleton(android设计模式的应用场景)

给getInstance方法加锁,这种加锁方式可以解决线程安全问题,但是每次外部对象要获取实例的时候都要进行线程锁定,之后还要再判断instance是否被实例化了,这样在多线程高并发的情况下效率损失就很可观了.

后来又延伸出了一种双检锁实例的方式,这种方式只在第一次实例化的时候进行加锁,并在在加锁前后都会对是否实例化了进行判定.性能方面优于单检锁的形式.但是这种双检锁还会遇到一个问题,就是在不同的平台或不同的编译器下可能出现错误.主要是因为有些编译器优化了new Singleton()的过程,假设线程AB并发获取实例,在有些编译器下可能会出现A线程实例化instance的过程中,当系统已经给instance分配到内存,但是还没有初始化instance的成员变量的时候,时间片让给了B进程,这时候instance已经不为null了,B就直接拿着实例去操作成员变量,但是这个时候成员变量还没有被初始化,结果就可能crash了.当遇到这种编译器问题的时候就需要给instance变量加上volatile修饰,去除编译器优化的干扰.

2.饿汉模式

饿汉模式是在系统运行起来,在装在类的时候就进行初始化的操作,外部对象使用的时候不需要做任何判断可以直接使用,从效率上来说是优于懒汉模式的.但是对比懒汉模式的延迟加载技术,不管系统用不用该实例,内存都会在最开始的时候创建出来.跟懒汉的时间换空间正好相反,饿汉是空间换时间.

三.总结根据上面的分析可以很清楚的了解到:饿汉模式不用面对对线程并发的问题.并且从调用速度和响应时间来说饿汉模式要优于懒汉模式.但是从资源利用的角度来说懒汉模式要优于饿汉模式.转载请注明出处:

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android ListViewitem滑动出现删除按钮 我自己一个人弄的公司的产品客户端,所以还是想记录下来以免忘记或者丢失...在我的上一篇博文(点击打开链接)是一个文件管理的东西,基础组件也是

Android 4.1.2为通知栏添加wifi开关 摘自:

Android 4.4 eng版本 红框问题 在android4.4.2中编译的eng版本经常出现红框的问题。通过排查因为在frameworks/base/core/java/android/os/StrictMode.java文件中打开了设置选项具体修改如下:---a/frame

标签: android设计模式的应用场景

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

上一篇:Android 4.1.2系统添加重启功能(android4.4.2升级包)

下一篇:Android ListViewitem滑动出现删除按钮

  • 汇算清缴计提所得税在哪个月
  • 单位外币账户领取流程
  • 无息贷款合同要按手印吗
  • 资产负债表月报期末余额怎么填
  • 其他权益工具和交易性金融资产
  • 个人出售住房缴纳房产税吗
  • 普通发票与增值税发票的图片
  • 事假扣薪
  • 发出材料汇总表金额怎么算
  • 个税父母赡养抵扣3000
  • 财务公司承兑汇票是商票还是银票
  • 已抵扣的进项税额红冲的账怎么做
  • 银行收回客户误扣的费用怎么处理?
  • 车间不生产时折旧怎么算
  • 销售机械设备的税率是多少
  • 增值税发票三个点
  • 人身意外伤害险保障范围
  • 营改增之后的增值税
  • 增值税专用发票跨月退回怎么办?
  • 开外经证预缴税款金额需要自己计算吗?建筑行业
  • 享受高新技术企业优惠的条件之一
  • 不应计入税金及附加的有哪些
  • 增值税进项大于销项月末需要结转吗
  • 物业维修收费合理吗
  • 建筑业调试费进什么科目?
  • 不可抵扣的进项税额如何做账
  • 企业报税提交清算了怎么撤销
  • 债券溢价发行会计分录举例
  • windows10.0
  • 城建税的会计分录是什么
  • 在windows7是一种
  • 工程咨询费用取费标准
  • PHP:xml_set_processing_instruction_handler()的用法_XML解析器函数
  • 收到汇算清缴退税账务处理
  • 年终奖税务筹划合法吗
  • threejs loader
  • 国有土地租赁合同规定多少年
  • 棕榈滩的读音
  • 拥有自我意识的动物有哪些
  • 进项税年末结转分录
  • 公司基本户没有开户许可证
  • 机器学习评估指标 - f1, precision, recall, acc, MCC
  • Attentional Feature Fusion 注意力特征融合
  • php 命名空间 通俗易懂
  • 往来款项清查账务处理
  • 员工探亲证明怎么写
  • wordpress 设置
  • 开工程款发票有什么规定?
  • 怎么查是一般纳税人还是小规模
  • 制造费用属于费用性支出吗
  • 开发无形资产过程中发生的支出计入什么科目
  • 投资性房地产出售收入属于什么收入
  • 电子承兑汇票是银行承兑汇票吗
  • 临时用工费用计入什么会计科目
  • 失控发票补交上年所得税
  • 营业收入包括主营业务收入
  • 公司员工出差住酒店费用明细有问题怎么办
  • 固定资产清理产生的收入计入
  • 企业支付宝能买东西吗
  • 两套账的会计被判刑吗
  • mysql2003错误如何解决10061
  • 设置共享时可使用的权限
  • centos安装教程详解
  • win7旗舰版如何禁止更新
  • win10可以关闭的功能
  • win7系统开机后桌面黑屏
  • win7系统怎么启用本地连接
  • windows 8怎么样
  • 基于stm32的100个毕业设计
  • python字符串常用方法
  • javascript函数用法
  • 初步使用筷子而动作不规范的幼儿保育员应该
  • 在javascript中如何定义并调用函数
  • js初级教程
  • 小规模纳税人开专票需要交税吗
  • 江苏预包装食品备案网上流程
  • 车辆购置税纳税申报表下载
  • 企业应交个人所得税分录
  • 公司小规模怎么纳税
  • 浙江省地方税务局通用定额发票
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设