我希望能够深入了解创建调用类实例的相同方法的不同线程如何影响方法中的局部变量。
例如,我有一个只有一个方法(Divide)的类:
public class Maths
{
public int Num1;
public int Num2;
public void Divide()
{
for (long i = 0; i < 100000; i++)
{
Num1 = 2;
Num2 = 2;
int result = Num1 / Num2;
Num1 = 0;
Num2 = 0;
}
}
}
实例化了两个线程并调用了以下的除法方法:
static void Main(string[] args)
{
Maths m = new Maths();
Task t1 = new Task(() => m.Divide());
Task t2 = new Task(() => m.Divide());
List<Task> tl = new List<Task> { t1, t2 };
Parallel.ForEach(tl, task => task.Start());
Console.ReadLine();
}
}
有时这段代码运行良好。但是其他时候,它在以下行上抛出dividebyzero错误:
int result = Num1 / Num2;
我的假设是,其中一个线程正在重置Num1和Num2为零,就在另一个线程调用Num1 / Num2之前。因此导致除以零异常。
这很有道理,我应该使用锁,但我不明白这些局部变量Num1和Num2如何在线程之间共享,因为我的理解是局部变量不会在线程之间共享?