定义:
确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.
使用场景:
避免产生多个对象消耗过多的资源,或者某种类型的对象应该有且只有一个.
主意事项
- 构造函数不对外开放 一般为private
- 通过一个静态方法或者枚举返回单例类对象
- 确保单例类的对象有且只有一个,尤其是在多线程环境下
- 确保单例类对象在反序列化时不会重新构造对象
懒汉式单例模式
//懒汉式
public class Singleton {
//私有化一个静态变量
private static Singleton instance;
//私有化构造函数
private static synchronized Singleton getInstance() {
if (instance==null){
instance=new Singleton();
}
return instance;
}
}
Double Check Lock(DCL)单例模式
保证能够在需要的时候创建单例模式而且还能够保证线程是安全的
优点:资源利用率高
缺点是第一次加载反应稍微慢一点
public class SingletonDCL {
private static SingletonDCL mInstance=null;
private SingletonDCL(){};
public static SingletonDCL getSingletonDCL(){
//主要判断为了避免不必要的同步
if (mInstance==null){
synchronized (SingletonDCL.class){
//判断为了在null的情况下创建实例
if (mInstance==null){
mInstance=new SingletonDCL();
}
}
}
return mInstance;
}
}
静态内部类单例
保证了线程的安全,也保证了单例对象的唯一性,也延迟了单利的实例化
public class SingletonStatic {
private SingletonStatic(){ }
public static SingletonStatic getInstance(){
return SingletonHolder.mInstance;
}
private static class SingletonHolder{
private static final SingletonStatic mInstance=new SingletonStatic();
}
}