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

新手上路,请多包涵

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

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

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

原文由 Sled 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 428
2 个回答

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

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

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

原文由 Tomasz Nurkiewicz 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

原文由 Konrad Garus 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题