- 浏览: 225413 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
sfshine:
非常好非常好
Android 窗口管理 -
mthhk:
...
android3.0之Fragment(碎片)基础 -
FrankHB1989:
“C/C++标准不会保证这样的代码一定不会出错”的依据?你要说 ...
Duff's Device -
2006003845:
请问知道 刚体之间怎么不碰撞嘛 ?相互穿插
JBOX2D分析
当设计模式的观点被众人所推崇的时候,单例模式似乎已经成了掌握设计模式时候要掌握的基础模式。当然我并不认为设计模式中有基础和非基础之分,我只觉得模式的应用有普遍和非普遍之别。单例模式的普遍并不体现在应用场景多上,我们阅读一个项目的时候发现其实用到单例的类本身屈指可数。但是因为它写法简单,易于识别,所以我们才对它格外的注意。单例模式分成饿汉式和懒汉式。这两种模式在写法上有一定的区别,你不能单独地推崇某种写法。这些都是要根据具体的场景来区分。现实中单例的场景屡见不鲜,windows系统中的回收站就是典型的单例场景。在windows系统中,回收站是只会存在一个的东西。其实从结构来说,操作系统也是一个单例,部署在操作系统之上的所有进程都共享同一个系统,只不过是被映射到自己的虚拟空间中去。现实中,对于一个国家的zhuxi,总统,家庭里的一家之主从概念上都可以称其为单例。是的,单例模式的名字非常的应景,就是单个的实例。当然也有一些书籍上面写到单件模式,我们知道是一个东西就行。
单例模式的懒汉式写法是一种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:《非子墨》的空间
单例模式的懒汉式写法是一种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:《非子墨》的空间
发表评论
-
Java中循环嵌套跳出的高效写法
2014-04-24 19:31 3069(下面写的这些并不是Jdk的新特性,也不是Java某个版本提供 ... -
子墨对酒《三国杀》里论模式(三)适配器模式
2014-02-11 18:39 712如果你是一个Android程 ... -
子墨对酒《三国杀》里论模式(二)门面模式
2014-02-11 18:38 567学 习模式的人对门面 ... -
子墨对酒《三国杀》里论模式(一)工厂模式
2014-02-11 18:37 1062有人说模式会让代码变的优雅,也有人说模式会让你的代码更利于扩 ... -
Proguard 源码分析 (七) 混淆
2013-11-10 21:19 1756本章我们讲Proguard非常重要的一个步骤:混淆Obfu ... -
Proguard源码分析(六)前文总结
2013-11-05 14:40 1027目前,我们读了Proguard的 ... -
java class文件结构(转)
2013-11-05 13:46 895学习Java的朋友应该都 ... -
Proguard源码分析(五) ConfigurationParser.keep参数
2013-10-31 14:43 3883本章节我们绕回来讲Keep参数,也就是Configurat ... -
Proguard源码分析(四) 压缩
2013-10-30 10:59 1066上一次我们讲了seed文件,这次我们说压缩,对应的输出文件是 ... -
Proguard源码分析(三)Seed文件
2013-10-29 12:45 1473Seed文件就是保持住的类文件,直白一点就是不被混淆的文件, ... -
Proguard源码分析(二)输出文件
2013-10-28 10:28 866ProGuard outputs thefollowing ... -
Android 2.2.2到Android 4.2.2源码下载地址(转)
2013-10-28 10:13 944Android 2.2.2到Android 4.2.2源码下 ... -
代码混淆器Proguard源码分析(一) 读取
2013-10-22 19:40 2256Proguard是Android中经常用的混淆工具,当然你也 ... -
OpenJDK源码阅读导航
2013-03-12 15:36 1330这是链接帖。主体内容都在各链接中。 怕放草稿箱里过会儿又坑掉 ... -
Scala 中apply方法的用法~(转)
2013-03-11 11:53 8640Scala 是构建在 JVM 上的静态类型的脚本语言,而脚 ... -
jdk的bin目录详解
2012-10-16 17:02 977javac:Java编译器,将Java源代码换成字节代 ... -
深入JVM---JVM命令---invokespecial(转)
2012-07-24 14:12 136119.3 指令invokespecial Invokespec ... -
JASMIN编程笔记(转)
2012-11-21 23:32 1004現在做個簡單的 Compiler,包括三個部份,scan ... -
ByteBuffer的allocate和allocateDirect(转)
2012-04-24 21:35 1238在Java中当我们要对数据进行更底层的操作时,通常是操作数据的 ... -
挺好的总结~(java性能优化~)
2012-04-03 17:39 0最近的机器内存又爆满 ...
相关推荐
很好的Ip转换刷网站东东 真的很好用 我一直用啊 你们也一起用吧
家里和公司轻松更换IP地址,不用重复设置!
ip自动变换 适合 各种上网用户 可以用来来做网赚
不论采用何种方式的拨号上网,均可使用本软件自动切换IP,本软件可用来刷网站的IP流量、IP切换工具来使用,本软件具备以下功能: 1)自动拨号器:自动拨号上网,断线自动重拨,支持ADSL以及路由器等标准拨号网络;...
柳子墨 飞机大战.sb3
子墨IP变换软件 V1.0.............
CPRI帧格式详解 --子墨祭
北京东亚荔景园项目企划提案报告 --子墨.pptx
ZimoLoveShuang.github.io:子墨的博客
子墨支付V7.0(安装后查看使用说明) V7.0更新内容 1.更新商户登录注册模版 2.更换商户中心模版 V6.66更新内容 1.修复登陆记录ip不显示位置bug 2.修复客户反应的已知bug V6.45更新内容 1.更加完善了3号模板 ...
点心省电是北京风灵创景科技有限公司(点心os)开发的点心系列软件,和电池监测器Battery Monitor Widget Pro类似,拥有一键优化、预设省电模式、自动校准的时间预估、耗电指数查看和状态栏显示功能,总的来说,点心...
这是一款精巧的ip转换工具,可以实现在短时间内单个ip使用较长时间
系统功能列表里主要包括: 1.账号管理,在这里管理员可以修改个人信息,包括密码和个人资料等等。 2.用户注册管理部分是对该网站的申请注册的用户进行验证通过,管理员可以对所有用户进行删除修改和审核。 ...
第一个在嵌式培训机构写的小项目,拿出来和大家分享下,互相学习。0.0
非常实用,作为摘要指导,对于要写论文发文章的同志来说会节省不少时间的,大家努力!
子墨 轻松管理问题的 git 工具 如何使用 将所有文件复制到包含所有 depos 的主文件夹 启动问题 ./zimo start num_issue main_depo_issu depo1 depo2 ... 将depo添加到问题中 ./zimo add num_issue main_depo_issu ...
(长途汽车数据由广大网友和各汽车站提供和更新)示范站点:1、交通信息在线 http://www.jt160.com/demo/2、子墨网 http://www.zimow.com/demo/二、 长途汽车查询API适合哪些网站使用? 长途汽车查询API可以适合任何...
(列车数据从铁道部官方网站获取,保证是最新、最准确的数据)示范站点:1、交通信息在线 http://www.jt160.com/demo_lc/2、子墨网 http://www.zimow.com/demo_lc/二、 列车时刻查询API适合哪些网站使用? 列车时刻...
进群答案:子墨 因为一些原因,今日校园疫情收集表,签到,查寝等相关项目不再维护和更新 项目说明 config.yml 默认配置文件 config_xxxx.yml xx学校的配置文件,xxxx是学校英文简称 index.py 完成自动提交的py脚本 ...