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

标签 java multithreading performance static final

我必须使用一个永远不会在方法中更改的变量,该方法将在许多线程中频繁使用。这些变体中哪个更有效?
变体 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/

相关文章:

java - 在appender中指定多个文件

python - 如何指定只允许某些第一个组合的 itertools 排列?

mysql - 计算表中所有行但只选择一个的最有效方法

python - Django 模型 - 继承成本

java - 如何获取 XML 文件的特定信息

java - 如何将 "case"放入循环中

java - 如何查找 MP3 音频剪辑的标题?

c# - Interop 字进程不会立即关闭

multithreading - 使用rabbitmq与多线程之间的区别

java - 多线程与多个应用程序