在标准java环境下,比如我们要对MyApplication(继承于Application)对象创建单例,常见的双重检验锁写法如下:
public static MyApplication getInstance() {
if (instance != null) {
synchronized (MyApplication.class) {
if (instance != null) {
instance = new MyApplication();
}
}
}
return instance;
}
但是在Android中,这种写法就存在一定的问题,我们确实获取到了MyApplication的对象,但是这个对象是我们用new 创建出来的,这并不是由Android系统自动创建的对象。而且由于此instance在创建时没有传入context,使用此instance调用instance.getApplicationContext()方法会报空指针异常而导致app崩溃。
其实,像Application这种由系统保护的绝对单例,在创建的时候直接传入instance就可以了。示例代码如下:
public class MyApplication extends Application {
private static MyApplication instance;
@Override
public void onCreate() {
super.onCreate();
instance = this;
}
public static MyApplication getInstance() {
return instance;
}
}
类似的受系统保护的单例还有:SingleTask 和SingleInstance启动模式下的Activity。