正在从实例方法线程安全调用静态方法
本文关键字:安全 调用 静态方法 线程 实例方法 | 更新日期: 2023-09-27 18:11:11
在下面的例子中调用实例方法RenderHelp
线程安全吗?它调用Helper
类的静态方法,但不使用该类的任何静态变量。如果Helper
的2个或更多不同的实例(每个运行在不同的线程上)调用RenderHelp
,是否有曾经是一个问题?
public class Helper
{
public string ID { get; set; }
// other fields
static int[] Multiply(int[] a, int[] b)
{
if (a.Length == b.Length) return a.Zip(b, (a1, b2) => a1 * b2).ToArray();
else return null;
}
static int[] Add(int[] a, int[] b)
{
if (a.Length == b.Length) return a.Zip(b, (a1, b2) => a1 + b2).ToArray();
else return null;
}
public int[] RenderHelp(string help, int[]a, int[] b)
{
if (help == "Add".ToLower()) { return Add(a,b); }
else if (help == "Multiply".ToLower()) { return Multiply(a,b); }
else return null;
}
}
链接到相关的MSDN或其他文档将非常感激。谢谢你。
*为什么stackoverflow不能正确格式化get
,如上所述?
是的,这是线程安全的。线程问题通常发生在共享资源的时候,这里我们不会这样做。这是遵循微软线程建议:
避免提供改变静态状态的静态方法。共同之处服务器场景中,静态状态是跨请求共享的,这意味着多个线程可以同时执行该代码。这就打开了线程错误的可能性。考虑使用设计模式它将数据封装到不跨实例共享的实例中请求。
如果你要在这些函数的某个地方使用静态变量,那么除非你开始使用锁或其他线程安全的方法来处理该变量,否则它将不是线程安全的。