0

http://en.wikipedia.org/wiki/Double_checked_locking_pattern#Usage_in_Javaで最適化としてローカル変数を使用しています。283 を追加すると、「Java VM の一部のバージョン」で 25% 高速になります。この種のローカル変数の利点は、関連する変数が静的な場合にも適用されますか? Android にも適用されますか?

では、これらgetInstance()の s のうち、Android でより高速なのはどれですか (または同じですか?):

A:

class Something {

    private static volatile Something instance = null;

    public static Something getInstance(Context context) {
        Something local = instance;
        if (local==null) {
            synchronized(Something.class) {
                local = instance;
                if (local==null) {
                    instance = local = new Something(context);
                }
            }
        }
        return local;
    }
}

また

B.

class Something {

    private static volatile Something instance = null;

    public static Something getInstance(Context context) {
        if (instance==null) {
            synchronized(Something.class) {
                if (instance == null) {
                    instance = new Something(context);
                }
            }
        }
        return instance;
    }
}

なぜ?

(心配しないでください。 はSomethingへの参照を保持しませんcontext。インスタンス化に必要なため、一時的に使用するだけです。そのため、インスタンス化を「怠惰」にする必要があるようです。)

あなたの答えが「テストするだけ」である場合、そのための手順を教えてもらえますか? しかし、違いがある場合は、違いの理由を知りたいです(とにかくないかもしれません)。

4

1 に答える 1

0

最速の方法は、ダブルチェックをスキップして、まだスレッドセーフな方法で作業することだと思います:

public final class Foo {
    private static volatile Foo mInstance      = new Foo();

    private Foo() {
        // do what ever you want
    }

    /**
     * @return The singleton object
     */
    public static Foo getInstance() {
        return mInstance;
    }

    /**
     * @return the singleton object with new context
     */
    public static Foo getInstance(Context context) {
        mInstance.setContext(context); // just as an example
        return mInstance;
    }
}
于 2013-03-27T11:59:50.383 に答える