当设计模式的观点被众人所推崇的时候,单例模式似乎已经成了掌握设计模式时候要掌握的基础模式。当然我并不认为设计模式中有基础和非基础之分,我只觉得模式的应用有普遍和非普遍之别。单例模式的普遍并不体现在应用场景多上,我们阅读一个项目的时候发现其实用到单例的类本身屈指可数。但是因为它写法简单,易于识别,所以我们才对它格外的注意。单例模式分成饿汉式和懒汉式。这两种模式在写法上有一定的区别,你不能单独地推崇某种写法。这些都是要根据具体的场景来区分。现实中单例的场景屡见不鲜,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:《非子墨》的空间

子墨对酒《三国杀》里论模式(肆)单例模式相关推荐

  1. 子墨对酒《三国杀》里论模式(一)工厂模式

    有人说模式会让代码变的优雅,也有人说模式会让你的代码更利于扩展.我个人觉得这些说 的都对.但是滥用模式一样会成为被人诟病的痛点.与其说面向对象语言考察的主要标准是语法,不如考察对模式的理解更加切合实际 ...

  2. 子墨对酒《三国杀》里论模式(三)适配器模式

    如果你是一个Android程序员,那么你一定对适配器模式情有独钟.如果你还不知道 适配器模式为何物,你还陶醉在自己对AdapterView子类运用的有多熟的暗中自喜中,希望这篇文章能给你当头棒喝.人们 ...

  3. 子墨对酒《三国杀》里论模式(二)门面模式

    学 习模式的人对门面模式都不会太陌生,如果说工厂模式是对对象的高层次抽象的话,那么门面模式就是对对象,就是一种更高层次的抽象.这么说可能不好理解,我 们举个很好理解的例子,我们知道cpu的目的是为了运 ...

  4. 子墨对酒《三国杀》里论模式(伍)模板方法

    如果你是J2EE的爱好者,相信你对模板方法并不陌生.是的,很多框架的设计都是基于模板方法.在我看来,我们也能用面向方面的概念来理解模板方法(当然这么说可能不合适).模板方法的就是将它的部分实现逻辑交给 ...

  5. 子墨庖丁-Gson的源码分析(1)-开篇

    因为工作的关系,使用到了Gson,先暂停了书写Proguard的文章,回到Gson的研究.当然也不会总是研究Gson,我会两个项目跳着来.完全按照自己的兴趣来.我个人觉得Gson是一个非常优秀的jso ...

  6. 子墨庖丁Android的ActionBar源代码分析 (一)实例化

    假设你从事过Androidclient开发,相信你对ActionBar这套框架并不陌生,或者说你并不了解它,可是你应该时不时的要跟它打交道.抛开ActionBar的实现不说,ActionBar实际上是 ...

  7. 子墨掩码到底是干嘛的?

    前言 基本上每台计算机的网卡配置里都有这么一项子墨掩码的配置,子墨掩码的值一般都是255.255.255.0 ,那么这个玩意到底是干嘛的呢?今天我们就来揭开它神秘的面纱! IP分配 没错 ,子墨掩码的 ...

  8. 子墨庖丁Android的ActionBar源码分析 (一)实例化

    如果你从事过Android客户端开发,相信你对ActionBar这套框架并不陌生,或者说你并不了解它,但是你应该时不时的要跟它打交道.抛开ActionBar的实现不说,ActionBar实际上是对An ...

  9. 鸿蒙抖音直播发言人是谁,抖音惊现“鲁班大师”,山村小杰万能子墨齐上阵,真实身份遭曝光...

    黄梅戏<夫妻双双把家还>,一直都深受广大民众的喜爱,这首歌更是传唱祖国大地.小编非常喜欢这首歌中的几句歌词:"你耕田来我织布,我挑水来你浇园."这句歌词,大概描绘出了很 ...

最新文章

  1. 推荐一个你最喜欢的辅助办公软件,你会推荐什么?
  2. Blink Coordinate Spaces
  3. 洛谷 P3376 【模板】网络最大流
  4. POJ1456贪心(set或者并查集区间合并)
  5. 七.Hystrix Timeout机制
  6. 图书推荐:《ASP.NET.基础教程——C#案例版》
  7. 爬虫1_python2
  8. python核心编程——python对象
  9. 关于position的四个标签
  10. 现代计算机是以多用户,计算机操作系统 第7章 设备管理 练习题
  11. maven 生命周期的指令
  12. 学算法有什么用?唉,对你来说,可能真没用
  13. 高中生入门计算机编程,高中生必看:入门学软件编程,看这三点...
  14. echarts3 标线markLine
  15. 用oracle做九九乘法表,Oracle三种循环例题:打印九九乘法表
  16. (014) 类函数和对象函数
  17. Ubuntu系统管理 —— 使用SSH及SCP实现远程登陆与数据传输
  18. 【An electroencephalographic signature predicts antidepressant response in major depression-笔记】
  19. 基于MTK平台kpd 驱动解析
  20. 保留核心,刺激进步 ——读《马克思传》有感

热门文章

  1. 2021最新高端HTML前端网站模板下载
  2. Snipaste 提高十倍生产力工作效率,堪称最强神器
  3. 解决0x81000370不能登录MSN
  4. 起名如何计算五行与笔划
  5. 正则表达式,Re模块函数 学习笔记之二
  6. X-editable 文档 中文版
  7. android 组件的id,Android@id和@+id的区别 - 泡在网上的日子
  8. 实验报告三201521460014
  9. 软碟通 UltraISO,虚拟光盘文件的制作,编辑,转换工具,可以直接编辑虚拟光盘或提取文件,打开isz,iso的工具,注册码...
  10. ping 丢包 网络摄像头_用ping ,mtr ,traceroute 进行网络丢包分析