确保某个类有且只有一个对象,避免产生多个对象消耗过多的资源,或者某种类型的对象只应该有且只有一个。
例如:创建一个对象需要消耗的资源过多,如要访问IO和数据库等资源,这时就要考虑使用单例。
单例关键点:
构造方法私有化
静态方法或者枚举返回单例类对象
多线程环境下确保类对象只有一个
类对象在反序列化时不会重新构建对象
实现方法:
1.饿汉式
public class Singleton {
private static final Singleton mInstance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return mInstance;
}
}
2.懒汉式
synchronized关键字,同步锁,保证多线程情况下单例
public class Singleton {
private static Singleton mInstance = null;
private Singleten() {}
public static synchronized Singleton getInstance() {
if (mInstance == null) {
mInstance = new Singleton();
}
return mInstance;
}
}
3.双重检查锁 DCL
DCL能在需要时实例化对象,又能保证线程安全,且初始化实例后不再进入同步代码块
volatile,它的意思是:被volatile修饰的变量的值,将不会被本地线程缓存,所有对该变量的读写都是直接操作共享内存,从而确保多个线程能正确的处理该变量。
public class Singleton {
private volatile static Singleton mInstance = null;
private Singleton() {}
public static Singleton getInstance() {
if (mInstance == null) {
synchronized (Singleton.class) {
if (mInstance == null) {
mInstance = new Singleton();
}
}
}
return mInstance;
}
}
4.静态内部类
public class Singleton {
private Singleton() {}
public static Singleton getInstance() {
return SingletonHolder.mInstance;
}
private static class SingletonHolder {
private static final Singleton mInstance = new Singleton();
}
}
5.枚举
public enum SingletonEnum {
INSTANCE;
public void doSomething() {
............
}
}
Android中的应用:
系统级别的服务,LayoutInflater等
优点:
减小内存开支,防止资源多重占用