Singleton - 实例化类的最佳方法

时间:2016-03-08 01:23:50

标签: java singleton

我正在查看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;
}

2 个答案:

答案 0 :(得分:1)

这是出于性能原因。

考虑变量初始化的最常见情况。写入的代码将读取volatile变量一次并返回值。你的版本会读两遍。由于易失性读取会带来轻微的性能成本,因此使用局部变量可能会更快。

因为在你的情况下,懒惰的初始化变量是静态的,所以最好使用持有者类习语。有关示例,请参阅this answer

答案 1 :(得分:0)

确定这篇文章是关于" Java安全发布" http://shipilev.net/blog/2014/safe-public-construction/将帮助您了解单身人士如何运作