java – 如果非同步静态方法不修改静态类变量,它们是否是线程安全的?

我想知道如果你有一个静态方法是’不’同步,但’不’修改任何静态变量是线程安全的吗?如果该方法在其中创建局部变量呢?例如,以下代码是否是线程安全的?

public static String[] makeStringArray( String a, String b ){
    return new String[]{ a, b };
}

因此,如果我有两个线程连续地同时调用ths方法,一个与狗(说“大丹犬”和“公牛狗”),另一个与猫(说“波斯语”和“暹罗”),我会得到猫和狗在同一个数组?或者猫和狗永远不会同时在同一个方法的调用中?

最佳答案
这个方法是100%线程安全,即使它不是静态的。线程安全的问题出现在你需要在线程之间共享数据 – 你必须照顾原子性,可见性等。

此方法仅对参数进行操作,这些参数驻留在堆栈和对堆上不可变对象的引用。堆栈本身就是线程本地的,所以不会发生数据共享。

不可变对象(在这种情况下为String)也是线程安全的,因为一旦创建,它们不能被改变,并且所有线程都看到相同的值。另一方面,如果方法是接受(可变)日期,你可能有一个问题。两个线程可以同时修改同一个对象实例,导致竞争条件和可见性问题。

转载注明原文:java – 如果非同步静态方法不修改静态类变量,它们是否是线程安全的? - 代码日志