通过多线程调用静态方法 - 它们可以干扰彼此的输入参数吗

Calling static method via Multiple threads - Can they meddle with each other's Input Parameters

我的代码被 AJAX UI(多线程)调用,post 数据处理在 Json 中发送输出。最近在重构代码时,我们将许多常用和重复的方法转移到一个单独的文件中,我们将它们设为静态,因为我们不处理任何静态/共享数据。 以下是我们静态方法的示例设计:

public class Helper
{
   public static C Method1(List<A> aList, List<B> bList)
   {
      C objC = new C();

      // Create ObjC based on inputs aList and bList

      return objC;
   }
}

现在,我的理解是以下调用不会有问题,在Parallel.foreach或任何其他多线程场景中调用时,请验证。

C resultC = Helper.Method1(aList, bList);

但是我们有疑问,是否存在一种罕见的情况,即两个线程进行上述调用,一个线程的aList bList 数据被另一个线程替换,从而给出有缺陷的结果(可能是异常) ,就此而言,这将无法调试和重复,因为两个线程必须在方法执行所需的精确毫秒内一起执行/执行

请分享您的看法,我们是否在正确的轨道上创建上述设计或存在我们无法看到的坑。我们可以很容易地用实例方法替换,在这种情况下它们肯定是线程安全的,因为每个线程都有自己的实例可以使用,但我觉得可能不需要并且继续创建实例很麻烦,当我们可以方便地使用时静态调用。

请注意,到目前为止我还没有看到代码 运行 的问题,但正如我所说,如果发生这种情况,那将是极端情况,因为两个线程同时出现,一个线程被替换输入参数,而其他线程仍在处理结果。

方法调用不会干扰来自不同线程的其他方法调用。您只需要仔细考虑静态变量。此外,如果您在线程之间共享输入参数 aList 或 bList,您可能 运行 会遇到麻烦。

只要您在所有不同的线程中传递不同的 List 实例,您的问题的简短回答是 .NET 可以很好地处理线程,本身不会陷入混乱,只有当您的代码鼓励它这样做时,事情才会变得混乱。

事情变得混乱的方式是 共享 跨不同线程的状态。因此,举个例子,有一个静态方法,您可能认为在某处使用静态变量是个好主意:

private static int count;

public static void MyMethod() {
   count = count + 1;
   if(count == 5) {
      console.log("Equal to 5");
   }
};

这种方法不是线程安全的,因为count可以同时被两个不同的线程修改。事实上,count 可能会增加到 5,然后另一个线程在 if 检查之前将它增加到 6,因此你永远不会记录任何东西——这显然有点混乱。

您可以共享状态的另一种方式是,如果您传入某些内容,因此我在答案开头的警告。如果您将同一个对象从多个线程传递到方法中,这个对象理想情况下应该是 immutable 所以在您的情况下是一个无法修改的集合。这可以防止方法的内部修改可能影响另一个线程的对象。正如已经提到的,这只是一个问题,如果你在不同的线程中传递相同的实例。