单例模式可能是平常开发中使用最多的模式了。
那么单例模式是怎么样的:单例模式的类必须保证只有一个实例存在。多用于整个程序只需要有一个实例,通常很消耗资源的类,比如网络请求,IO操作,访问数据库等。由于类比较耗资源,所以没必要让它构造多个实例。
单例的定义
确保某一个类只有一个实例,并且自行实例化,向整个系统提供这个唯一实例。
单例的几种实现方式
饿汉式:
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance(){
return instance;
}
}
优点:
①线程安全
②类加载时已经创建好了一个静态对象,调用时反应快。
缺点:
①资源效率不高,可能没有使用getInstance,但是其他途径加载了
该类,这个实例依然会初始化。
懒汉式:
public class Singleton{
private static Singleton instance;
private Singleton(){}
public static **synchronized** Singleton getInstance(){//注意同步
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
优点:
资源利用率高,延迟初始化,可使用类其他静态方法。
缺点:
第一次加载慢,多线程情况下不必要的同步开销增大。
双重校验锁:
public class Singleton{
private volatile static Singleton instance;//注意volatile 关键字
private Singleton(){}
public static synchronized Singleton getInstance(){
if(instance == null){
synchronized(Singleton.class){
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}
添加了volatile关键字,保证了执行顺序。保证了高并发下会出现的问题。
静态内部类:
public class Singleton{
private Singleton(){}
public static Singleton getInstance(){
return SingletonHolder.instance;
}
private static class SingletonHolder{
private static final Singleton instance = new Singleton();
}
}
网友评论