我必须使用一个永远不会在方法中更改的变量,该方法将在许多线程中频繁使用。这些变体中哪个更有效?
变体 1:
public class Test {
private static int myVar;
public Test(int myVar){
this.myVar=myVar;
}
public void frequentlyUsedMultiThreadMethod(){
//read myVar
}
}
变体 2:
public class Test {
public void frequentlyUsedMultiThreadMethod(int myVar){
//read myVar
}
}
变体 3:
public class Test {
private final int myVar;
public Test(int myVar){
this.myVar=myVar;
}
public void frequentlyUsedMultiThreadMethod(){
//read myVar
}
}
最佳答案
无论从哪个位置读取单个 int
都非常快,以至于您很难构建一段代码来证明三种方法之间有意义的时间差异从您的问题中,更不用说在任意代码中找到差异了。构建基准的问题是变量永远不会改变,因此编译器将被允许在每次方法调用时读取一次,即使 frequentlyUsedMultiThreadMethod
在循环中访问它也是如此。
在这种情况下,最好的方法是考虑哪种方法能反射(reflect)程序中数据的逻辑使用。
- 应该放弃第一种方法,因为多个实例设置相同的静态变量。当使用相同的值时,这是令人困惑的,而当
myVar
的多个值用于不同的实例时,这是错误的。 - 第二种方法要求调用者多次传递同一个变量,而该值在构造时可用。虽然比第一种方法更容易混淆,但这种方法并不理想。
- 第三种方法在代码中显示,
myVar
的值是每个实例一个,并且不会更改。对于您在问题中描述的情况,这是最合乎逻辑的方法。
关于java - 在 Java 中什么是更快地传递参数或使用静态变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39423922/