这是EventBus getDefault()静态方法的一部分代码,该方法返回EventBus类的静态实例。
/** Convenience singleton for apps using a process-wide EventBus instance. */
public static EventBus getDefault() {
EventBus instance = defaultInstance;
if (instance == null) {
synchronized (EventBus.class) {
instance = EventBus.defaultInstance;
if (instance == null) {
instance = EventBus.defaultInstance = new EventBus();
}
}
}
return instance;
}
我看到代码首先检查instance是否为null,然后在synced块中再次进行相同的检查。为什么会这样。
如果我这样写怎么办?
/** Convenience singleton for apps using a process-wide EventBus instance. */
public static EventBus getDefault() {
EventBus instance = defaultInstance;
if (instance == null) {
synchronized (EventBus.class) {
instance = EventBus.defaultInstance = new EventBus();
}
}
return instance;
}
我的版本有问题吗?我在这里想念什么?
答案 0 :(得分:1)
在您的代码中,当instance为null时,两个线程可以同时进入if语句内部。然后,一个线程进入同步块以初始化实例,而另一个则被阻塞。当第一个线程退出同步块时,等待线程进入并创建另一个Singleton对象。请注意,当第二个线程进入同步块时,它不会检查实例是否为非空。
因此,我们遵循双重检查初始化,其中包括: