在 Android 中进行单例延迟初始化的正确方法是什么?

Ian*_*ick 0 android

在工作中的 Sonar 报告中,我们对 Android 项目提出了一些警告:

多线程正确性 - 静态字段 findbugs 的延迟初始化不正确:LI_LAZY_INIT_STATIC

为了纠正这些问题,我被引导到有关双重检查锁定的维基百科条目

http://en.wikipedia.org/wiki/Double_checked_locking_pattern#Usage_in_Java

当我查看 Android 框架代码时,我没有看到使用双重检查锁定,例如,WebViewDatabase 类只是使其 getInstance(Context) 方法同步:

public static synchronized WebViewDatabase getInstance(Context context) {
    if (mInstance == null) {
        mInstance = new WebViewDatabase(context);
    }
    return mInstance;
}
Run Code Online (Sandbox Code Playgroud)

Android 中正确的方法是什么?

提前致谢

zap*_*apl 5

public static synchronized WebViewDatabase getInstance没有使用双重检查锁定,因此不存在该问题。对于双重检查锁定,您在锁外部检查实例是否存在,如果存在则跳过锁。这会导致执行速度比始终锁定更快,因为您只需要在开始时锁定一次。

如果它使用双重检查锁定,它看起来像

public static WebViewDatabase getInstance(Context context) {
    if (mInstance == null) {
        synchronized (WebViewDatabase.class) {
            if (mInstance == null)
                mInstance = new WebViewDatabase(context);
        }
    }
    return mInstance;
}
Run Code Online (Sandbox Code Playgroud)

并且mInstance需要定义volatile

Android 与桌面 Java 的同步/单例/双重检查锁定方面没有变化