我的代码由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 :(得分: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,因此您永远不会记录任何内容 - 这显然会有点令人困惑。 / p>
你可以分享状态的另一种方式是,如果你传递了一些东西,那么我在答案开始时就会发出警告。如果将同一个对象从多个线程传递到方法中,那么理想情况下该对象应该是immutable,因此在您的情况下,无法修改该集合。这可以防止方法的内部修改可能影响另一个线程的对象。如前所述,如果您在不同的线程中传递相同的实例,这只是一个问题。
答案 1 :(得分:0)
方法调用不会干扰来自不同线程的其他方法调用。你必须仔细考虑静态变量。此外,如果您在线程之间共享输入参数aList或bList,则可能会遇到麻烦。