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

我想知道如果你有一个同步的静态方法,但不修改任何静态variables是线程安全的吗? 那么如果方法里面创build了局部variables呢? 例如,下面的代码是线程安全的吗?

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

所以如果我有两个线程连续地,同时地调用这个方法,那么一个与狗(称为“大丹犬”和“公牛狗”)和另一个与猫(称为“波斯”和“暹罗语”),我会得到猫和狗在同一个数组? 或者,猫狗不会同时在同一个方法的调用中?

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

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

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

当一个方法改变一些共享状态时,它只能是线程不安全的。 是否静止是无关紧要的。

该function是完全线程安全的。

如果你考虑这个问题…假设这会发生什么,如果这是不同的。 如果不同步,每个常用函数都会产生线程问题,所以JDK中的所有API函数都必须进行同步,因为它们可能会被多个线程调用。 而且由于大多数时候应用程序正在使用一些API,multithreading应用程序将是不可能的。

这太可笑了,所以只为你:如果有明确的理由可能会有问题,方法不是线程安全的。 试着总是想想如果在我的函数中有多个线程,如果你有一个步debugging器,并会一步接一步地提前第一个…然后第二个线程…也许第二个…会有问题吗? 如果你find一个,它不是线程安全的。

请注意,大部分的Java 1.5集合类都不是线程安全的,除了那些声明的,如ConcurrentHashMap。

如果你真的想深入了解这个,请仔细看看volatile关键字和所有的副作用。 看看Semaphore()和Lock()类,以及它们在java.util.Concurrent中的朋友。 阅读类中的所有API文档。 这也是值得学习和满足的。

对不起,这个过于详细的答案。

使用static关键字和synchronized静态方法来修改线程间共享的静态数据。 使用static关键字,所有创build的线程都将争用该方法的单个版本。

使用volatile关键字和同步实例方法将保证每个线程都拥有自己的共享数据副本,并且不会在线程之间泄漏读/写操作。

string对象不可变是上面线程安全的另一个原因。 相反,如果使用可变对象(比如makeMutableArray ..),那么线程安全性肯定会中断。