private static ActivityLifeManager sInstance;
public static ActivityLifeManager getInstance() {
if (sInstance == null) {
sInstance = new ActivityLifeManager();
}
return sInstance;
}
主要原因是线程安全问题。多线程有可能会对该方法调用造成实例化多次。在该方法加synchronized。
双重加锁可能存在的一个问题:
例如线程1已经分配了地址给instance 但是还没有初始化, 此时线程2 判断intance不是null 直接返回
解决:
volatile的:禁止指令重排序优化,也就保证了instance变量被赋值的时候对象已经是初始化过的,从而避免了上面说到的问题。
最终改为:
private static volatile ActivityLifeManager sInstance;
public static ActivityLifeManager getInstance() {
if (sInstance == null) {
synchronized (ActivityLifeManager.class) {
if (sInstance == null) {
sInstance = new ActivityLifeManager();
}
}
}
return sInstance;
}