0

我的代码被AJAX UI(多线程)调用,并在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的一个线程数据被另一线程所取代,从而得到有缺陷的结果(可以是例外),因为两个线程必须在精确的毫秒内一起运行/执行,这种方法需要执行

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

请注意直到现在我还没有看到代码运行的问题,但正如我所说如果这种情况发生,它将是角落的情况下,两个线程来同时和一个线程替换输入参数,而其他线程仍然处理结果。

+0

每个调用都有自己的线程 – 2015-02-06 08:41:09

+0

调用该方法应该没有什么区别,如何使用它* may *,如果'resultC'被用作静态变量,那么可能会发生。 – Sayse 2015-02-06 08:41:34

+4

*参数*对于多线程来说不是问题,*您传递给这些参数的可能是*,但是我们无法从您的示例中知道这一点。意思是,如果你在不同的线程上传递相同的列表对象给两个这样的方法调用,那么是的,你会遇到问题,但不是因为参数本身。 – 2015-02-06 08:42:33

回答

4

对于您的问题的简短回答是,只要您在所有不同的主题中传递不同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,因此在您的情况下,无法修改该集合。这可以防止方法的内部修改可能影响另一个线程的对象。如前所述,如果您在不同线程中传递相同的实例,这只是一个问题。

+0

感谢您的详细解答,它确实说明了我的疑问。我正在考虑创建不同对象并将其传递给静态方法的问题。我不修改静态方法内的任何静态数据类型 – 2015-02-06 12:55:55

0

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

相关问题