什么时候需要担心线程安全?

Bri*_*asa 5 java multithreading thread-safety

在某些情况下,您需要担心静态方法是否是线程安全的?

例如,如果我有静态实用程序函数,它不接触任何静态类级别变量,那么该方法是否已经是线程安全的?如果我有一个触摸静态类变量的静态方法,该方法是否可能不是线程安全的?

提前致谢.

Mar*_*ers 6

如果我有静态实用程序函数不接触任何静态类级别变量,该方法是否已经线程安全?

大部分时间 - 重要的是如果您的方法是可重入的.这样的东西是可重入的,因为一切都是局部变量,每个线程都有自己的副本:

static int add(int a, int b)
{
    return a + b;
}
Run Code Online (Sandbox Code Playgroud)

还有一些事情需要注意.如果您将一个对象传递给该方法,并且该方法会改变该对象,并且在该方法完成之前,您再次在另一个线程上调用相同的方法,但是使用相同的对象,则会出现问题.

如果我有一个触摸静态类变量的静态方法,该方法是否可能不是线程安全的?

主要问题是如果变量是可变的.如果您只是从不可变对象中读取,那么可能没有任何问题.

如果你调用一个方法并且你不确定它是否是可重入的并且文档没有说明,那么最好假设它不是.


Pet*_*iuk 5

如果在静态方法中仅使用本地堆栈变量,则没有理由担心.java.lang.Math.min(int,int)就是这种方法的一个很好的例子.但是如果您触摸任何共享静态变量,或者具有状态(也就是不可变)的对象,则必须使用同步.