从实例方法线程安全地调用静态方法吗?

时间:2015-09-03 10:29:00

标签: c# .net multithreading c#-4.0 thread-safety

在下面的示例中调用实例方法RenderHelp是否安全?它调用Helper类的静态方法,但不使用该类的任何静态变量。 如果Helper的两个或多个不同实例(每个都在不同的线程上运行)调用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,如上所述?

1 个答案:

答案 0 :(得分:3)

是的,这是线程安全的。线程问题通常发生在共享资源周围,您在此处没有这样做。这是遵循Microsoft threading建议:

  

避免提供改变静态的静态方法。共同的   在服务器场景中,静态状态在请求之间共享,这意味着   多个线程可以同时执行该代码。这打开了   线程错误的可能性。考虑使用设计模式   将数据封装到不共享的实例中   请求。

如果要在这些函数中的某处使用静态变量,那么除非你开始使用锁定或其他线程安全的方法处理该变量,否则它不会是线程安全的。