一句话定义:
确保一个类只有自我创建的单独实例并提供接口供整个系统使用。
使用场景:
避免产生多个对象消耗过多的资源(类似数据库的连接);某种类型的对象有且只有一个类型(生成唯一序列号)。
实现要点:
1. 构造函数私有化
2. 提供静态方法接口访问
3. 保证访问线程安全
4. 防止序列化导致重新生成实例对象
常用实现方式:
1.饿汉式
public class Singleton {
private static Singleton mInstance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return mInstance;
}
}
常见的方式,实现简单。
2.DCL 双重校验锁
public class Singleton {
private static Singleton mInstance = null;
private Singleton(){}
public static Singleton getInstance(){
if (mInstance == null){
synchronized (Singleton.class){
if (mInstance == null){
mInstance = new Singleton();
}
}
}
return mInstance;
}
}
实现复杂,但是安全性高。
3.静态内部类
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
与DCL同样安全,但不会发生DCL失效问题,推荐使用。
4.枚举
public enum Singleton{
INSTANCE;
public void doWhat(){}
}
反序列化不会重新生成对象,同时线程安全。上述其余方式必须加入如下方法可不重新生成对象。
private Object readResolve() throws ObjectStreamException{
return mInstance;
}
补充内容: 静态域 与 实例域
域 : 应该叫做 field。也就是我们常说的类的 属性~。
public class demo{
static int A;
int B;
}
如上:
A 为静态域,即静态属性,有static修饰;
B 为实例域,即普通属性,构建实例时创建。