定义:安全
单例模式:确保某一个类只有一个实例,并且自行实例化并向整个系统提供这个实例。多线程
使用场景:函数
确保某一个类有且只有一个对象的场景,避免产生多个对象消耗过多的资源,或者某种类型的对象只应该有且只有一个。线程
UML类图:对象
单例模式几个关键点:blog
一、构造函数不对外开放,通常为private。内存
二、经过一个静态方法或者枚举返回单例类对象。资源
三、确保单例类的对象有且只有一个,尤为在多线程环境下。get
四、确保单例类对象在反序列化时不会从新构建对象。同步
单例模式简单代码:
public class Singleton{
static Singleton instance=null;
private void Singleton(){}
public static Singleton getInstance(){
if(instance==null){
instance=new Singleton();
}
return instance;
}
}
单例模式其余方式:
一、懒汉模式:声明一个静态对象,而且在用户第一次调用getInstance时进行初始化,在getInstance()方法中添加了synchronized关键字,实现该方法的同步管理,特别是在多线程状况下,防止重复初始化。
该模式优势:单例只有在使用时才被实例化,节省资源;缺点:第一次加载实例化,反应慢,最大问题是每次调用getInstance()方法都须要同步,形成没必要要的同步开销。
public class Singleton{
static Singleton instance=null;
private void Singleton(){}
public static synchronized Singleton getInstance(){
if(instance==null){
instance=new Singleton();
}
return instance;
}
}
二、Double Check Lock(DCL双重检查锁定)
DCL方式实现单例模式优势是,既可以在须要时才初始化单例,又能保证线程安全,而且单例对象初始化后调用getInstance()方法不进行同步锁。
该实现方式最大的优势在于getInstance()方法上,针对于instance对象进行了两次验证是否为NULL;这两种判断主要作了三件事情:
(1)给Singleton实例对象分配内存(2)调用Singleton的构造函数,初始化成员字段(3)将instance对象指向分配的内存空间;
实例代码以下:
public class Singleton{
static Singleton instance=null;
private void Singleton(){}
public static Singleton getInstance(){
if(instance==null){
synchronized(Singleton.class){
instance=new Singleton();
}
}
return instance;
}
}
三、静态内部类单例模式
在Singleton类中声明一个静态内部类,静态类里实现单例对象的实例化,这样既能够确保线程安全,也可保证单例对象惟一性,同时延迟单例的实例化,这是比较推荐的一种方式。
public class Singleton{
static Singleton instance=null;
private void Singleton(){}
public static Singleton getInstance(){
return SingletonTool.instance;
}
/****静态内部类****/
private static class SingletonTool{
private static final Singleton instance=new Singleton();
}
}
单例模式优势:减小内存开支,避免资源浪费,常住内存,实现全局数据管理和共享;
单例模式缺点:扩展难,若是在Android中持有Context,容易形成内存泄漏,最好使用Application Context;