- 浏览: 230412 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
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 3149(下面写的这些并不是Jdk的新特性,也不是Java某个版本提供 ... -
子墨对酒《三国杀》里论模式(三)适配器模式
2014-02-11 18:39 747如果你是一个Android程 ... -
子墨对酒《三国杀》里论模式(二)门面模式
2014-02-11 18:38 603学 习模式的人对门面 ... -
子墨对酒《三国杀》里论模式(一)工厂模式
2014-02-11 18:37 1101有人说模式会让代码变的优雅,也有人说模式会让你的代码更利于扩 ... -
Proguard 源码分析 (七) 混淆
2013-11-10 21:19 1791本章我们讲Proguard非常重要的一个步骤:混淆Obfu ... -
Proguard源码分析(六)前文总结
2013-11-05 14:40 1062目前,我们读了Proguard的 ... -
java class文件结构(转)
2013-11-05 13:46 985学习Java的朋友应该都 ... -
Proguard源码分析(五) ConfigurationParser.keep参数
2013-10-31 14:43 3918本章节我们绕回来讲Keep参数,也就是Configurat ... -
Proguard源码分析(四) 压缩
2013-10-30 10:59 1110上一次我们讲了seed文件,这次我们说压缩,对应的输出文件是 ... -
Proguard源码分析(三)Seed文件
2013-10-29 12:45 1517Seed文件就是保持住的类文件,直白一点就是不被混淆的文件, ... -
Proguard源码分析(二)输出文件
2013-10-28 10:28 898ProGuard outputs thefollowing ... -
Android 2.2.2到Android 4.2.2源码下载地址(转)
2013-10-28 10:13 990Android 2.2.2到Android 4.2.2源码下 ... -
代码混淆器Proguard源码分析(一) 读取
2013-10-22 19:40 2291Proguard是Android中经常用的混淆工具,当然你也 ... -
OpenJDK源码阅读导航
2013-03-12 15:36 1409这是链接帖。主体内容都在各链接中。 怕放草稿箱里过会儿又坑掉 ... -
Scala 中apply方法的用法~(转)
2013-03-11 11:53 8715Scala 是构建在 JVM 上的静态类型的脚本语言,而脚 ... -
jdk的bin目录详解
2012-10-16 17:02 1006javac:Java编译器,将Java源代码换成字节代 ... -
深入JVM---JVM命令---invokespecial(转)
2012-07-24 14:12 142319.3 指令invokespecial Invokespec ... -
JASMIN编程笔记(转)
2012-11-21 23:32 1026現在做個簡單的 Compiler,包括三個部份,scan ... -
ByteBuffer的allocate和allocateDirect(转)
2012-04-24 21:35 1271在Java中当我们要对数据进行更底层的操作时,通常是操作数据的 ... -
挺好的总结~(java性能优化~)
2012-04-03 17:39 0最近的机器内存又爆满 ...
相关推荐
子墨IP变换软件v1.0是一款专为用户设计的便捷IP地址切换工具,它能够帮助用户在家庭和工作场所之间快速、轻松地更改计算机的IP地址,避免了手动配置的繁琐过程。这款软件适用于那些需要频繁更换网络环境或者希望保护...
很好的Ip转换刷网站东东 真的很好用 我一直用啊 你们也一起用吧
ip自动变换 适合 各种上网用户 可以用来来做网赚
不论采用何种方式的拨号上网,均可使用本软件自动切换IP,本软件可用来刷网站的IP流量、IP切换工具来使用,本软件具备以下功能: 1)自动拨号器:自动拨号上网,断线自动重拨,支持ADSL以及路由器等标准拨号网络;...
柳子墨 飞机大战.sb3
子墨IP变换软件 V1.0.............
《子墨IP变换工具V2.0简体中文版》是一款专为用户设计的高效IP地址切换软件,尤其适用于那些需要频繁更改IP地址以实现多种网络功能或保护隐私的用户。这款工具以其简洁的界面和强大的功能,在同类产品中脱颖而出。 ...
子墨支付V7.0(安装后查看使用说明) V7.0更新内容 1.更新商户登录注册模版 2.更换商户中心模版 V6.66更新内容 1.修复登陆记录ip不显示位置bug 2.修复客户反应的已知bug V6.45更新内容 1.更加完善了3号模板 ...
策略模式
【CPRI】(Common Public Radio Interface)帧格式详解 CPRI是一种专为射频单元(Radio Equipment Controller,REC)和射频单元(Radio Equipment,RE)之间通信设计的接口标准,它定义了从物理层(Layer 1)到数据...
【标题】"ZimoLoveShuang.github.io:子墨的博客" 暗示这是一个个人博客网站,由用户ZimoLoveShuang创建并托管在GitHub上。博客通常用于分享技术文章、个人见解或项目经验,因此我们可以期待这个博客中包含有关IT...
报告提到了北京市的城市空间发展战略,即“两轴、两带、多中心”模式,这为项目提供了发展机遇。通过在郊区建立适合50万人口居住和工作的新型城市,可以缓解市中心的人口压力。 4. **绿色住宅**: 报告强调了项目...
2024年第十四届APMCM亚太地区大学生数学建模竞赛参赛纪律和论文提交方式说明.pdf2024年第十四届APMCM亚太地区大学生数学建模竞赛参赛纪律和论文提交方式说明.pdf2024年第十四届APMCM亚太地区大学生数学建模竞赛参赛...
本文以晁子墨同学的操作系统课程设计为案例,深入探讨了课程设计中涉及的三个核心部分:生产者-消费者问题、内存管理和快速文件系统。 首先,生产者-消费者问题是多线程编程中的一项经典课题,它模拟的是资源生产和...
系统功能列表里主要包括: 1.账号管理,在这里管理员可以修改个人信息,包括密码和个人资料等等。 2.用户注册管理部分是对该网站的申请注册的用户进行验证通过,管理员可以对所有用户进行删除修改和审核。 ...
5. 公共服务优化:大数据可以分析公众的需求和行为模式,帮助政府优化公共服务,如公共交通路线调整、医疗资源分配等。 在《大数据与城市规划》的习题中,可能涵盖了数据获取、预处理、存储、分析以及结果解释等...
2024年第十届数维杯国际大学生数学建模挑战赛论文提交流程.pdf
通过对以上内容的分析,我们可以看出,《2010年12月四级串讲讲义》不仅提供了详细的备考策略和解题技巧,还通过实战演练的方式帮助学生更好地理解和应用这些技巧。对于准备参加英语四级考试的学生来说,这份讲义具有...