下面是来自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;
}我看到代码首先检查实例是否为null,然后在同步块中再次进行相同的检查。为什么会这样呢。
如果我这样写呢。
/** 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;
}我的版本有什么问题吗?我在这里错过了什么?
发布于 2018-12-25 11:37:30
在代码中,当实例为null时,两个线程可以并发地进入if语句。然后,一个线程进入同步块初始化实例,而另一个线程被阻塞。当第一个线程退出同步块时,等待线程进入并创建另一个Singleton对象。注意,当第二个线程进入同步块时,它不会检查实例是否为非空。
因此,我们遵循双重检查初始化,它包括:
https://stackoverflow.com/questions/53921895
复制相似问题