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はダブルチェックロックを使用していないため、問題はありません。ダブルチェックロックの場合、インスタンスが存在する場合はロックの外側をチェックし、存在する場合はロックをスキップします。これにより、最初に1回だけロックする必要があるため、常にロックするよりも実行が速くなります。

ダブルチェックロックを使用している場合は、次のようになります。

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 に答える