【发布时间】:2018-12-25 11:22:17
【问题描述】:
这里是 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;
}
我看到代码首先检查实例是否为空,然后在同步块中再次进行相同的检查。为什么会这样。
如果我这样写会怎样。
/** 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;
}
我的版本有问题吗?我在这里缺少什么?
【问题讨论】:
-
这称为double-checked locking。尝试您首选的搜索引擎以获取更多信息。
-
在单例初始化后,它通过避免使用同步块来提高性能。从 Java 5 开始,最好使用 volatile。见上面的链接,或者这个:cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
-
您的版本错误,因为它允许多个线程创建新的 EventBus 实例。如果你不介意这一点,那就没有什么问题了。
标签: java android greenrobot-eventbus greenrobot-eventbus-3.0