是我的c#静态方法中的一个非静态类线程安全
本文关键字:一个 静态类 安全 线程 我的 静态方法 | 更新日期: 2023-09-27 18:05:13
我有一个c#类,它可以用不同的构造函数实例化,但它也包含一些静态助手方法,这些方法只能使用它们的参数,也可以从其他类调用。
现在我想知道从不同的线程并发调用到这样的方法是否线程安全,或者换句话说,是否有可能静态方法中的变量被call2改变,而call1仍在处理中?
public class AwesomeClass
{
/* constructors and stuff */
public static bool HelperMethod(object o1)
{
string someString = "";
Func<object, string> doSomething = (o) => {
string someOtherString == null;
if (someString.Length == 0)
{
/* time consuming process using o... frequently
changes someString and someOtherString */
}
return someOtherString;
};
return doSomething(o1).Length > 0 && someString.Length < 10;
}
}
如果示例中的someString
可以通过thread2调用HelperMethod
而doSomething
仍然为thread1工作来改变,我就有麻烦了。
如果你的静态方法不改变任何成员变量,也不对其参数调用变化的方法,那么它就是可重入的,因此是线程安全的。
当并发线程使用与参数相同的对象调用静态方法时,对其形参执行变异操作的静态方法可能不是线程安全的。
例如,如果您的方法通过方法、属性或公共变量改变o1
,则该方法将不再是线程安全的。
HelperMethod
是线程安全的,因为它不访问任何共享数据。someString
是一个局部变量,它将在每次调用该方法时重新分配。
注意这个答案不受someString
是闭包的一部分这一事实的影响。每次调用HelperMethod
时,将在堆栈上分配单独的闭包对象(其中包含someString
的特定实例)。
变量someString
和someOtherString
是本地调用,它们不被调用共享。这就像有一个函数调用本身一样,在第二次调用中修改变量不会修改第一次调用。
可能不安全的一件事是time consuming process using o...
,如果你对o1
做的操作不安全,可以由多个线程一次完成,你可能会遇到问题。