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

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

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

因此,如果我有两个线程连续和同时调用ths方法,一个线程与狗(说“大丹麦”和“斗牛犬”),另一个线程与猫(说“波斯”和“暹罗”)在同一阵列中会得到猫和狗吗?还是猫和狗永远不会同时在同一个调用方法中?


答案 1

此方法是100%线程安全的,即使它不是。当您需要在线程之间共享数据时,线程安全性问题就会出现 - 您必须注意原子性,可见性等。static

此方法仅对驻留在堆栈上的参数和对堆上不可变对象的引用进行操作。堆栈本质上是线程的本地,因此永远不会发生数据共享。

不可变对象(在本例中)也是线程安全的,因为一旦创建它们就无法更改,并且所有线程都可以看到相同的值。另一方面,如果该方法接受(可变),则可能存在问题。两个线程可以同时修改同一个对象实例,从而导致争用条件和可见性问题。StringDate


答案 2

只有当方法更改某些共享状态时,它才可能是线程不安全的。它是否是静态的无关紧要。


推荐