在Android中进行单例懒惰初始化的正确方法?

时间:2012-08-31 13:27:19

标签: 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;
}

Android中的正确方法是什么?

提前致谢

1 个答案:

答案 0 :(得分:4)

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;
}

mInstance需要定义volatile

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