0

在工作中的 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中的正确方法是什么?

提前致谢

4

1 回答 1

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

并且mInstance需要定义volatile

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

于 2012-08-31T13:32:36.723 回答