标签:
这是我在学习《Android源码设计模式解析和实战》过程中对单例模式作一个记录。方便以后随时翻看。
单例模式是应用最广泛的模式之一,使用的常见场景
: 网络请求,访问IO,数据库和线程池等很消耗资源的情况下,可以考虑使用单例模式。
中心原则就是:
单例实例在类装载时构建。将构造函数私有化,使得外部程序不得通过构造函数创建对象,只能通过静态方法返回一个唯一的静态对象。
public class Singleton{
private static final Singleton sInstance = new Singleton();
//构造函数私有化
private Singleton(){}
public static Singletoon getInstance() {
return sInstance;
}
}
单例实例在第一次被调用时进行初始化。
懒汉模式的实现如下:
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
在获取单例对象的静态方法中添加了synchronized,这可以在多线程下保证单例对象的唯一性。
缺点
:
不建议使用
懒汉模式。public class Singleton {
//private static Singleton instance = null;
//防止DCL失效问题,保证instance对象每次都是从住内存中读取
private static volatile Singleton instance = null;
private Singleton() {}
public static Singleton getInstance() {
//避免不必要的同步
if (instance == null) {
synchronized (Singleton.class) {
//在instance = null下创建实例
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
缺点
:
优点
:
只是看起来很完美
指令重排
new Instance()到底发生了什么?
解决方案1
解决方案2
点击(此处)折叠或打开
在《Java 并发编程实践》中提及了DCL失效的问题(上面基于volatile的双重检查锁例子中注释的部分),建议使用如下代码替换:
public class Singleton {
private static final Singleton sInstance;
private Singleton() {}
public static Singleton getInstance() {
return SingletonHolder.sInstance;
}
private static class SingletonHolder {
sInstance = new Singleton();
}
}
优点
:
推荐使用
的单例模式实现方式。public class SingletonEnum {
INSTANCE;
public void doSomething() {
//do something;
}
}
优点
:
然而上述的几种单例模式实现中在反序列化时会重新创建对象。要杜绝单例对象重新生成对象,必须要加入如下方法:
private Object readResolve() throws ObjectStreamException {
return sInstance;
}
标签:
原文地址:http://www.cnblogs.com/linghu-java/p/5673114.html