Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android正在使用一个局部变量;“双重检查锁定”;(在其他情况下)比使用静态变量更快?_Android_Performance_Static_Local - Fatal编程技术网

Android正在使用一个局部变量;“双重检查锁定”;(在其他情况下)比使用静态变量更快?

Android正在使用一个局部变量;“双重检查锁定”;(在其他情况下)比使用静态变量更快?,android,performance,static,local,Android,Performance,Static,Local,在Joshua Bloch的“有效Java,第二版”,第。283,使“Java虚拟机的某些版本”的速度提高25%。当相关变量也是静态变量时,这种局部变量的好处是否也适用?它是否适用于Android 那么,以下哪一项在Android上更快(或者它们是一样的?): A: 或 B 为什么 (别担心,Something没有保留对上下文的引用,它只是暂时使用它,因为它需要它来实例化,这就是为什么我似乎需要实例化是“懒惰的”。) 如果你的回答是“测试一下”,你能告诉我这样做的步骤吗?但是我想知道差异的原因,

在Joshua Bloch的“有效Java,第二版”,第。283,使“Java虚拟机的某些版本”的速度提高25%。当相关变量也是静态变量时,这种局部变量的好处是否也适用?它是否适用于Android

那么,以下哪一项在Android上更快(或者它们是一样的?):

A:

B

为什么

(别担心,
Something
没有保留对
上下文的引用,它只是暂时使用它,因为它需要它来实例化,这就是为什么我似乎需要实例化是“懒惰的”。)


如果你的回答是“测试一下”,你能告诉我这样做的步骤吗?但是我想知道差异的原因,如果有的话(可能根本没有)。我认为最快的方法是跳过双重检查,使用线程安全的方法:

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;
    }
}
如果没有使用上下文获取的信息,则我的“Foo”无效,并且我的“setContext”必须同步,因此每次以这种方式调用
getInstance(context)
可能会导致每次调用的“锁获取/释放”开销。
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;
    }
}
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;
    }
}