子墨对酒《三国杀》里论模式(肆)单例模式
当设计模式的观点被众人所推崇的时候,单例模式似乎已经成了掌握设计模式时候要掌握的基础模式。当然我并不认为设计模式中有基础和非基础之分,我只觉得模式的应用有普遍和非普遍之别。单例模式的普遍并不体现在应用场景多上,我们阅读一个项目的时候发现其实用到单例的类本身屈指可数。但是因为它写法简单,易于识别,所以我们才对它格外的注意。单例模式分成饿汉式和懒汉式。这两种模式在写法上有一定的区别,你不能单独地推崇某种写法。这些都是要根据具体的场景来区分。现实中单例的场景屡见不鲜,windows系统中的回收站就是典型的单例场景。在windows系统中,回收站是只会存在一个的东西。其实从结构来说,操作系统也是一个单例,部署在操作系统之上的所有进程都共享同一个系统,只不过是被映射到自己的虚拟空间中去。现实中,对于一个国家的主席,总统,家庭里的一家之主从概念上都可以称其为单例。是的,单例模式的名字非常的应景,就是单个的实例。当然也有一些书籍上面写到单件模式,我们知道是一个东西就行。
单例模式的懒汉式写法是一种lazy load的写法
class Instance {
public static Instance getInstance() {
if (sInstance == null) new ;...
}
}
这里我们可以看出采用懒汉式写法出现的一些问题,最直观的就是线程同步。为了保证线程同步我们可能采用:
public sync static Instance getInstance() {
if (sInstance == null) ...
}
增加syn关键字的方式来同步数据。但是我们知道,线程同步会严重的降低代码运行的效率,如果你打算使用同步的话,不妨可以考虑降低代码块的大小:
public static Instance getInstance() {
sync(lock) {
if (sInstance == null) new;
}
...
}
那么这就满足了么?我们当然不会满足现状,我们如果还想要跟深层次的优化,我们不妨考虑的更底层一点。我们假设底层的cpu或者运行虚拟机采用的是流水线方式处理指令,那么如果你的假设条件为真的可能性比较大的时候,那么流水线建立成功的可能性就大。我们知道sInstance这个对象==null只有在第一次被调用的时候,既然这样,sInstance==null这个条件出现的概率几乎为0.因此为了保证流水线的稳定我们将条件换一种写法:
public static Instance getInstance() {
sync(lock) {
if (sInstance != null) return;
}
...
}
当然这种方法可能在宏观上的效果并不明显,虚拟机或者CPU也未必按照我们的方式来运行,但是我还是推崇这种习惯。那有没有一种不使用同步块,又能避免同步问题的,而且也不用主动的new单例的写法呢?~
当然是有的,首先我们要建立一个知识点,就是java中的类加载是一种lazy load的机制。每一个类只有在使用的时候才会被加载,加载的过程本身就是同步的。
public static Instance getInstance() {
return Inner.INSTANCE;
}
static class Inner{
public static final Instance INSTANCE;
}
代码中我们用到了内部类的方式来获得单例数据。这就完成了同步和lazyload单例的功能。
饿汉式的写法就简单的:
class Instance {
private static final Instance INSTANCE = new ...
}
我们发现单例在Instance类被加载的时候就产生,至于有没有必要要final这个参数其实无所谓,我偏爱加上,主要为了增加一点微不足道的效率。
我们来看看三国杀。《三国杀》里的消息盒子就是一个比较单例。
我们不妨设想一下如果采用两个对象来存储消息的话,那么消息的同步就是一个非常懊恼的问题之一。你可能在任何模式下接受消息,也有可能在任何模式下修改消息,或者删除消息。对于单例对象来说一个对象改变了那么你整个的程序中部署在这个对象上的观察者就会变化。另外单例模式也是我们前文提到的IOC的一种表现。关于IOC的信息请参考:
http://blog.csdn.net/hello__zero/article/details/18815487
--非子墨
微博账号: 非子墨
QQ:1025250620
CSDN:《非子墨》的空间
子墨对酒《三国杀》里论模式(肆)单例模式相关推荐
- 子墨对酒《三国杀》里论模式(一)工厂模式
有人说模式会让代码变的优雅,也有人说模式会让你的代码更利于扩展.我个人觉得这些说 的都对.但是滥用模式一样会成为被人诟病的痛点.与其说面向对象语言考察的主要标准是语法,不如考察对模式的理解更加切合实际 ...
- 子墨对酒《三国杀》里论模式(三)适配器模式
如果你是一个Android程序员,那么你一定对适配器模式情有独钟.如果你还不知道 适配器模式为何物,你还陶醉在自己对AdapterView子类运用的有多熟的暗中自喜中,希望这篇文章能给你当头棒喝.人们 ...
- 子墨对酒《三国杀》里论模式(二)门面模式
学 习模式的人对门面模式都不会太陌生,如果说工厂模式是对对象的高层次抽象的话,那么门面模式就是对对象,就是一种更高层次的抽象.这么说可能不好理解,我 们举个很好理解的例子,我们知道cpu的目的是为了运 ...
- 子墨对酒《三国杀》里论模式(伍)模板方法
如果你是J2EE的爱好者,相信你对模板方法并不陌生.是的,很多框架的设计都是基于模板方法.在我看来,我们也能用面向方面的概念来理解模板方法(当然这么说可能不合适).模板方法的就是将它的部分实现逻辑交给 ...
- 子墨庖丁-Gson的源码分析(1)-开篇
因为工作的关系,使用到了Gson,先暂停了书写Proguard的文章,回到Gson的研究.当然也不会总是研究Gson,我会两个项目跳着来.完全按照自己的兴趣来.我个人觉得Gson是一个非常优秀的jso ...
- 子墨庖丁Android的ActionBar源代码分析 (一)实例化
假设你从事过Androidclient开发,相信你对ActionBar这套框架并不陌生,或者说你并不了解它,可是你应该时不时的要跟它打交道.抛开ActionBar的实现不说,ActionBar实际上是 ...
- 子墨掩码到底是干嘛的?
前言 基本上每台计算机的网卡配置里都有这么一项子墨掩码的配置,子墨掩码的值一般都是255.255.255.0 ,那么这个玩意到底是干嘛的呢?今天我们就来揭开它神秘的面纱! IP分配 没错 ,子墨掩码的 ...
- 子墨庖丁Android的ActionBar源码分析 (一)实例化
如果你从事过Android客户端开发,相信你对ActionBar这套框架并不陌生,或者说你并不了解它,但是你应该时不时的要跟它打交道.抛开ActionBar的实现不说,ActionBar实际上是对An ...
- 鸿蒙抖音直播发言人是谁,抖音惊现“鲁班大师”,山村小杰万能子墨齐上阵,真实身份遭曝光...
黄梅戏<夫妻双双把家还>,一直都深受广大民众的喜爱,这首歌更是传唱祖国大地.小编非常喜欢这首歌中的几句歌词:"你耕田来我织布,我挑水来你浇园."这句歌词,大概描绘出了很 ...
最新文章
- linux 串口minicom配置使用
- android sqlite自定义函数,Android中自定义一个View的方法详解
- 微信小程序页面间传递json数据
- odoo pivot中去掉求和_一文读懂深度学习中的卷积运算与图像处理
- 梅露可物语虚拟服务器,【图片】【萌新】主界面的使用方法(零基础版)【梅露可物语日服吧】_百度贴吧...
- otl_stream查询返回数据_Hive查询的18种方式,你都学会了吗?
- matlab runtime安装目录,matlab compiler runtime怎么安装
- 这些单晶XRD测试问题你了解吗?(一)
- AHP计算权重.mat
- 高中计算机工作要点,高中信息技术工作计划
- WMware15和虚拟机Win10镜像文件网盘分享
- 基于涂鸦智能开发板的墨水屏座位管理器——1.电路设计篇
- 成为独立游戏制作人需要注意的六件事
- 深度 | 蚂蚁金融智能平台:让AI在金融场景发挥作用
- 动手安装centOS6
- C语言基础课第五次作业
- 工业互联网与制造控制生产网络学习总结
- 表格的列标题具有排序功能可便于读者查阅
- 网站友链交换十个标准
- JavaScript 按字母顺序排列对象数组
热门文章
- 模数转换器ADC的常用术语和主要技术指标(二)
- 超声检测信号特征提取
- google桌面安装介绍
- Linux ubuntu 基本美化 还有常用应用安装
- VRTK4.0学习(六):给控制器添加激光射线
- dedecms 织梦发布文章改成默认待审核状态
- 解决mac dock栏全屏时不自动隐藏
- java web系统毕业论文_毕业论文--基于JavaWeb的网络购物中心系统的实现.doc
- python自动化测试教程百度云盘_Python接口自动化测试框架实战视频教程百度云下载...
- 贝尔RG200O-CA光猫破解