下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】如何解析AndroidJava语言中单例这种设计模式
本篇文章为大家展示了如何解析AndroidJava语言中单例这种设计模式,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。概念单例模式,又称单件模式或者单子模式,指的是一个类只有一个实例,并且提供一个全局访问点。实现思路在单例的类中设置一个private静态变量sInstance,sInstance类型为当前类,用来持有单例***的实例。将(无参数)构造器设置为private,避免外部使用new构造多个实例。提供一个public的静态方法,如getInstance,用来返回该类的***实例sInstance。其中上面的单例的实例可以有以下几种创建形式,每一种实现都需要保证实例的***性。饿汉式饿汉式指的是单例的实例在类装载时进行创建。如果单例类的构造方法中没有包含过多的操作处理,饿汉式其实是可以接受的。饿汉式的常见代码如下,当SingleInstance类加载时会执行private
static
SingleInstance
sInstance
=
new
SingleInstance();初始化了***的实例,然后getInstance()直接返回sInstance即可。public
class
SingleInstance
{
private
static
SingleInstance
sInstance
=
new
SingleInstance();
private
SingleInstance()
{
}
public
static
SingleInstance
getInstance()
{
return
sInstance;
}
}饿汉式的问题如果构造方法中存在过多的处理,会导致加载这个类时比较慢,可能引起性能问题。如果使用饿汉式的话,只进行了类的装载,并没有实质的调用,会造成资源的浪费。懒汉式懒汉式指的是单例实例在***次使用时进行创建。这种情况下避免了上面饿汉式可能遇到的问题。但是考虑到多线程的并发操作,我们不能简简单单得像下面代码实现。public
class
SingleInstance
{
private
static
SingleInstance
sInstance;
private
SingleInstance()
{
}
public
static
SingleInstance
getInstance()
{
if
(null
==
sInstance)
{
sInstance
=
new
SingleInstance();
}
return
sInstance;
}
}上述的代码在多个线程密集调用getInstance时,存在创建多个实例的可能。比如线程A进入null==sInstance这段代码块,而在A线程未创建完成实例时,如果线程B也进入了该代码块,必然会造成两个实例的产生。synchronized修饰方法使用synchrnozed修饰getInstance方法可能是最简单的一个保证多线程保证单例***性的方法。synchronized修饰的方法后,当某个线程进入调用这个方法,该线程只有当其他线程离开当前方法后才会进入该方法。所以可以保证getInstance在任何时候只有一个线程进入。public
class
SingleInstance
{
private
static
SingleInstance
sInstance;
private
SingleInstance()
{
}
public
static
synchronized
SingleInstance
getInstance()
{
if
(null
==
sInstance)
{
sInstance
=
new
SingleInstance();
}
return
sInstance;
}
}但是使用synchronized修饰getInstance方法后必然会导致性能下降,而且getInstance是一个被频繁调用的方法。虽然这种方法能解决问题,但是不推荐。双重检查加锁使用双重检查加锁,首先进入该方法时进行null==sInstance检查,如果***次检查通过,即没有实例创建,则进入synchronized控制的同步块,并再次检查实例是否创建,如果仍未创建,则创建该实例。双重检查加锁保证了多线程下只创建一个实例,并且加锁代码块只在实例创建的之前进行同步。如果实例已经创建后,进入该方法,则不会执行到同步块的代码。public
class
SingleInstance
{
private
static
volatile
SingleInstance
sInstance;
private
SingleInstance()
{
}
public
static
SingleInstance
getInstance()
{
if
(null
==
sInstance)
{
synchronized
(SingleInstance.class)
{
if
(null
==
sInstance)
{
sInstance
=
new
SingleInstance();
}
}
}
return
sInstance;
}
}volatile是什么Volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。使用volatile修饰sInstance变量之后,可以确保多个线程之间正确处理sInstance变量。关于volatile,可以访问深入分析Volatile的实现原理了解更多。利用static机制在Java中,类的静态初始化会在类被加载时触发,我们利用这个原理,可以实现利用这一特性,结合内部类,可以实现如下的代码,进行懒汉式创建实例。public
class
SingleInstance
{
private
SingleInstance()
{
}
public
static
SingleInstance
getInstance()
{
return
SingleInstanceHolder.sInstance;
}
private
static
class
SingleInstanceHolder
{
private
static
SingleInstance
sInstance
=
new
SingleInstance();
}
}关于这种机制,可以具体了解双重检查锁定与延迟初始化好奇问题真的只有一个对象么其实,单例模式并不能保证实例的***性,只要我们想办法的话,还是可以打破这种***性的。以下几种方法都能实现。使用反射,虽然构造器为非公开,但是在反射面前就不起作用了。如果单例的类实现了cloneable,那么还是可以拷贝出多个实例的。Java中的对象序列化也有可能导致创建多个实例。避免使用readObject方法。使用多个类加载器加载单例类,也会导致创建多个实例并存的问题。单例可以继承么单例类能否被继承需要分情况而定。可以继承的情况当子类是父类单例类的内部类时,继承是可以的。public
class
BaseSingleton
{
private
static
volatile
BaseSingleton
sInstance;
private
BaseSingleton()
{
}
public
static
BaseSingleton
getInstance()
{
if
(null
==
sInstance)
{
synchronized(BaseSingleton.class)
{
if
(null
==
sInstance)
{
sInstance
=
new
BaseSingleton();
}
}
}
return
sInstance;
}
public
static
class
MySingleton
extends
BaseSingleton
{
}
}但是上面仅仅是编译和执行上允许的,但是继承单例没有实际的意义,反而会变得更加事倍功半,其代价要大于新写一个单例类。感兴趣的童鞋可以尝试折腾一下。不可以继承的情况如果子类为单独的类,非单例类的内部类的话,那么在编译时就会出错ImplicitsuperconstructorBaseSingleton()isnotvisiblefordefaultconstructor.Mustdefineanexplicitconstructor,主要原因是单例类的构造器是private,解决方法是讲构造器设置为可见,但是这样
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电子商务物流配送技术的市场分析与展望
- 电商品质化背景下服务性消费的供求链模型探索
- 冷藏车运输行业发展趋势考核试卷
- 搪瓷卫生洁具行业标准制定考核试卷
- 家电产品知识考核试卷
- 环保科技在商业广告中的创新应用
- 现代农场安全作业中的铲车角色
- 构建企业战斗力的关键高效团队建设文稿设计研究
- 现代纹样设计在电子产品中的应用
- 2025-2030年厨电产品ODM服务行业跨境出海战略研究报告
- 二零二五年度大型自动化设备买卖合同模板2篇
- 2024版金矿居间合同协议书
- GA/T 2145-2024法庭科学涉火案件物证检验实验室建设技术规范
- 2025内蒙古汇能煤化工限公司招聘300人高频重点提升(共500题)附带答案详解
- 2025年中国融通资产管理集团限公司春季招聘(511人)高频重点提升(共500题)附带答案详解
- GB/T 11822-2000科学技术档案案卷构成的一般要求
- 压力管道基本知识课件
- 小学英语 国际音标 练习及答案
- 优秀班主任经验交流课件-班主任经验交流课件
- 2023年广州金融控股集团有限公司招聘笔试题库及答案解析
- 血液科品管圈汇报-PPT课件
评论
0/150
提交评论