单例模式(Singleton Pattern)
一、概念及技术背景
Ensure a class has only one instance, and provide a global point of access to it.确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
二、技术背景
单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。这样的模式有几个好处:
1、某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。
2、省去了new操作符,降低了系统内存的使用频率,减轻GC压力。
3、有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了。(比如一个军队出现了多个司令员同时指挥,肯定会乱成一团),所以只有使用单例模式,才能保证核心交易服务器独立控制整个流程。
三、代码实践
JDK:
• java.lang.Runtime#getRuntime()
• java.awt.Desktop#getDesktop()
Android: (Thread-Safe demo codes)
1. 实现方式1:非延迟实例化(饥汉模式)
好处:实例对象在类加载过程中就会被创建,无需关注线程安全问题。
缺点:如果过多使用的饿汉单例,则会生产出过多的实例对象,无论你是否要使用他们。
public class CityInfoUtil {
private static CityInfoUtil mInstance = new CityInfoUtil();
/*私有构造,限制用户自行实例化*/
private CityInfoUtil() {
}
public static CityInfoUtil getInstance() {
return mInstance;
}
}
2. 实现方式2:延迟实例化(饱汉模式)
好处:延时加载,用的时候才会生产对象。
缺点:需要保证同步,付出效率的代价。
public synchronized static WtContentProviderUtil getInstance(Context context) {
if (mInstance == null) {
mInstance = new WtContentProviderUtil(context);
}
return mInstance;
}
3. 实现方式3:延迟实例化(饱汉模式)的进阶方案:双重锁检查模式 --应弃用!
好处(本意):非空时,不需要再检查锁状态,提高效率
缺陷:双重检查锁定的问题是:并不能保证它会在单处理器或多处理器计算机上顺利运行。双重检查锁定失败的问题并不归咎于 JVM 中的实现 bug,而是归咎于 Java 平台内存模型。内存模型允许所谓的“无序写入”,这也是这些习语失败的一个主要原因。
public static WtContentProviderUtil getInstance(Context context) {
if (mInstance == null) {
/*双重检查加锁,减少使用同步*/
synchronized(WtContentProviderUtil.class){
if (mInstance == null) {
mInstance = new WtContentProviderUtil(context);
}
}
}
return mInstance;
}
网友评论