private static volatile SettingsDbHelper sInst = null; // <<< 这里添加了 volatile
public static SettingsDbHelper getInstance(Context context) {
SettingsDbHelper inst = sInst; // <<< 在这里创建临时变量
this.context = context.getApplicationContext();//获取Application的context避免内存泄漏
if (inst == null) {
synchronized (SettingsDbHelper.class) {
inst = sInst;
if (inst == null) {
inst = new SettingsDbHelper(this.context);
sInst = inst;
}
}
}
return inst; // <<< 注意这里返回的是临时变量
}
通过这样修改以后,在运行过程中,除了第一次以外,其他的调用只要访问 volatile 变量 sInst 一次,这样能提高 25% 的性能
Ps: 如果 this.context 不是 context.getApplicationContext(),而是 this.context = context , 那么当第一次调用的 activity 被销毁后,再次调用单例且有一些需要context 的逻辑,例如弹出dialog效果,将会显示不出来,需要注意.
网友评论