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