一、单例
单例指的是整个业务中只有一个实例,这样做能节省内存空间,不用重复创建,使用方便。
单例分为懒汉和饿汉模式,两种模式的代码写法均推荐写法二。
1.懒汉模式
懒汉代码写法一,如下:
public class LazySingleTon {
private static volatile LazySingleTon instance = null;
private LazySingleTon() {};
public static synchronized LazySingleTon sharedInstance() {
if (instance == null) {
instance = new LazySingleTon();
}
return instance;
}
}
这种写法因为每回调用调用sharedInstance都需要同步线程,所以多线程大批量操作时会影响效率,所以我们推荐写法2,只有首次为null的时候才锁定线程,之后不为null时,不锁定线程,直接返回instance
public class LazySingleTon {
private static volatile LazySingleTon instance = null;
private LazySingleTon() {};
public static LazySingleTon shareInstance() {
if (instance == null) {
synchronized (LazySingleTon.class) {
if (instance == null) {
instance = new LazySingleTon();
}
}
}
return instance;
}
}
2.饿汉模式
饿汉代码写法一,如下:
public class HungrySingleTon {
private static final HungrySingleTon instance = new HungrySingleTon();
private HungrySingleTon(){};
public static HungrySingleTon sharedInstance() {
return instance;
}
}
这种写法,因为采用静态常量的写法,在项目运行初期是一定会new个对象,占用了空间,可以采用内部类的静态常量的写法,这样可以在调用的时候才new个对象,可以节省内存空间。写法二如下:
public class HungrySingleTon {
private static class HungrySingleTonHolder {
private static final HungrySingleTon instance = new HungrySingleTon();
}
private HungrySingleTon(){};
public static HungrySingleTon sharedInstance() {
return HungrySingleTonHolder.instance;
}
}
以上所有代码均建议采用写法二,可以节省内存空间或减少内存支出~