我正在查看Telegrams的信使源代码,我注意到他们的单例类都在其getInstance方法中使用局部变量,如下所示。例如,在Android GitHub repo上,在课程NotificationsController.java上,他们有以下内容:
private static volatile NotificationsController Instance = null;
public static NotificationsController getInstance() {
NotificationsController localInstance = Instance;
if (localInstance == null) {
synchronized (MessagesController.class) {
localInstance = Instance;
if (localInstance == null) {
Instance = localInstance = new NotificationsController();
}
}
}
return localInstance;
}
我不完全确定本地var“localInstance”的用途是什么。任何人都可以准确解释“localInstance”var的目的是什么?如果没有它就不可能实现,就像在下面的代码中一样?
private static volatile NotificationsController Instance = null;
public static NotificationsController getInstance() {
if (Instance == null) {
synchronized (MessagesController.class) {
if (Instance == null) {
Instance = new NotificationsController();
}
}
}
return Instance;
}
答案 0 :(得分:1)
这是出于性能原因。
考虑变量初始化的最常见情况。写入的代码将读取volatile变量一次并返回值。你的版本会读两遍。由于易失性读取会带来轻微的性能成本,因此使用局部变量可能会更快。
因为在你的情况下,懒惰的初始化变量是静态的,所以最好使用持有者类习语。有关示例,请参阅this answer。
答案 1 :(得分:0)
确定这篇文章是关于" Java安全发布" http://shipilev.net/blog/2014/safe-public-construction/将帮助您了解单身人士如何运作