我想知道您是否有一个 未 同步但 不 修改任何静态变量的静态方法,它是线程安全的吗?如果该方法在其中创建局部变量怎么办?例如,下面的代码是线程安全的吗?
public static String[] makeStringArray( String a, String b ){
return new String[]{ a, b };
}
因此,如果我有两个线程连续并发地调用该方法,一个与狗(比如“大丹犬”和“斗牛犬”)和另一个与猫(比如“波斯”和“暹罗”)一起调用,我会得到猫和狗吗在同一个数组中?或者猫和狗永远不会同时在同一个方法调用中?
原文由 Sled 发布,翻译遵循 CC BY-SA 4.0 许可协议
这种方法是 100% 线程安全的,即使它不是
static
。当您需要在线程之间共享数据时,就会出现线程安全问题——您必须注意原子性、可见性等。此方法仅对 驻留在堆栈上的参数 和对堆上不可变对象的引用进行操作。 堆栈本质上是线程本地的,因此永远不会发生数据共享。
不可变对象(
String
在这种情况下)也是线程安全的,因为一旦创建它们就不能更改并且所有线程都看到相同的值。另一方面,如果该方法接受(可变)Date
你可能遇到了问题。两个线程可以同时修改同一个对象实例,从而导致竞争条件和可见性问题。