什么是更快的传递参数或在Java中使用静态变量?

Ale*_*ndr 5 java performance static multithreading final

我必须使用一个永远不会在方法中更改的变量,这个变量将在许多线程中经常使用.哪些变体更有效?
变式1:

public class Test {
    private static int myVar;
    public Test(int myVar){
        this.myVar=myVar;
    }

    public void frequentlyUsedMultiThreadMethod(){
        //read myVar
    }
}
Run Code Online (Sandbox Code Playgroud)

变式2:

public class Test {
    public void frequentlyUsedMultiThreadMethod(int myVar){
        //read myVar
    }
}
Run Code Online (Sandbox Code Playgroud)

变式3:

public class Test {
    private final int myVar;
    public Test(int myVar){
        this.myVar=myVar;
    }

    public void frequentlyUsedMultiThreadMethod(){
        //read myVar
    }
}
Run Code Online (Sandbox Code Playgroud)

das*_*ght 8

读一个单一的int,无论从哪个位置,都是如此极快,你很难构建一段代码来证明你的问题中三种方法之间有意义的时间差异,更不用说找到任意区别了一段代码.构造基准测试的问题是变量永远不会改变,因此即使frequentlyUsedMultiThreadMethod在循环中访问它,编译器也可以在每次方法调用时读取一次.

在这种情况下,最好的方法是考虑哪种方法反映了程序中数据的逻辑用法.

  • 应该忽略第一种方法,因为多个实例设置相同的静态变量.当使用相同的值时这会令人困惑,而当多个值myVar用于不同的实例时会出错.
  • 第二种方法要求调用者多次传递相同的变量,而值在构造时可用.虽然比第一种方法更容易混淆,但这种方法并不理想.
  • 第三种方法在代码中显示myVar每个实例的值为1,并且它不会更改.这是您在问题中描述的最合理的方法.