当需要网络加载之后进行一些操作,这时若有多个同时请求可能会出现拥堵现象,所以我们希望他们是一个一个来请求,那我们要怎么实现让他们一个一个请求呢,这时就需要网络请求采用单例的形式。
1)将网络请求类的构造方法设置为private
2)在类中定义一个private static的自己的实例
3)提供一个public static的getInstance()方法,将非空的实例返回
这样当别人需要用到我这个网络请求类的时候,通过类名.getInstance()就可以获得我的实例,并且因为getInstance()和实例都是static的,因此全局共用一个网络请求实例,这样会保证同一时刻只有一个进行网络请求,避免了网络拥堵。
对于实例和getInstance()的不同方式我们分为懒汉式和恶汉式
(1)懒汉式
public class LazySingleInstance {
private static LazySingleInstance lazy;
private LazySingleInstance() {
}
//Thread not safe
public static LazySingleInstance getLazy1() {
if (lazy==null)
lazy=new LazySingleInstance();
return lazy;
}
//Thread safe
public static LazySingleInstance getLazy2() {
if(lazy==null)
synchronized(LazySingleInstance.class) {
if(lazy==null)
lazy=new LazySingleInstance();
}
return lazy;
}
}
懒汉式有两种形式,若要用懒汉式一般都采用第二种线程同步的形式,因为第一种形式若两个线程同时进入请求,当第一个线程进去还没new完时,若第二个又进去再new一次,这样就达不到单例的效果了。
(2)恶汉式
public class EagerSingleInstance {
private static EagerSingleInstance eager=new EagerSingleInstance();
private EagerSingleInstance() {
}
public static EagerSingleInstance getEager() {
return eager;
}
}
恶汉式与懒汉式唯一的区别就在于new对象的位置不同,因为恶汉式形式简单,所以单例一般采用恶汉式。