定义
一个类有且仅有一个实例,并且自行实例化向整个系统提供。
特点
1.单例类只能有一个实例。
2.单例类必须自己创建自己的唯一实例。
3.单例类必须给所有其他对象提供这一实例。
实现方式
1.饿汉式
public class Singleton {
private static Singleton mInstance = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return mInstance;
}
}
使用:
Singleton instance = Singleton.getInstance();
优点:线程安全
缺点:没有懒加载(在类加载时就实例化了而不是在用到这个实例时)
2.懒汉式
2.1懒汉式一(不推荐使用)
public class Singleton {
private static Singleton mInstance;
private Singleton() {
}
public static Singleton getInstance() {
if (mInstance == null) {
mInstance = new Singleton();
}
return mInstance;
}
}
优点:懒加载
缺点:线程不安全
2.2懒汉式二_同步锁(不推荐使用)
public class Singleton {
private static Singleton mInstance;
private Singleton() {
}
public static synchronized Singleton getInstance() {
if (mInstance == null) {
mInstance = new Singleton();
}
return mInstance;
}
}
优点:懒加载、线程安全
缺点:效率低(每次调用getInstance方法都要同步,造成不必要的同步开销)
2.3懒汉式三_双重检查锁(Double Check Lock)
public class Singleton {
private volatile static Singleton mInstance;
private Singleton() {
}
public static Singleton getInstance() {
if (mInstance == null) {
synchronized (Singleton.class) {
if (mInstance == null) {
mInstance = new Singleton();
}
}
}
return mInstance;
}
}
优点:懒加载、线程安全
缺点:第一次加载时反应稍慢(同步锁),也由于Java内存模型的原因偶尔失败。
3.静态内部类
public class Singleton {
private Singleton() {
}
private static class SingletonHolder {
private static Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}
优点:懒加载、线程安全
缺点:待补充
原理:第一次调用getInstance方法时JVM加载SingletonHolder类,从而完成instance的初始化。
4.枚举
public enum Singleton {
INSTANCE;
private Singleton() {
}
public void method() {
}
}
使用:
Singleton.INSTANCE.method();
优点:线程安全、防反序列化
缺点:JDK1.5及以上
原理:默认枚举的创建是线程安全的,并且在任何情况下它都是一个单例。
总结
根据项目实际需要选择单例实现方式,推荐4.枚举>3.静态内部类>2.3懒汉式三_双重检查锁>1.饿汉式。
参考
《Android源码设计模式》
http://blog.csdn.net/dmk877/article/details/50311791
http://www.cnblogs.com/whoislcj/p/5543932.html