使用 System.Threading 的 Win Form 应用程序。两个线程线程 A 和线程 B 使用相同的方法 sumNumber 启动。总和数更新变量总计。因此,这两个线程尝试更新相同的变量。
使用监视器类同步对总变量的访问。
在 WindowsFormsApplication2 中出现"类型为'System.Threading.SynchronizationLockException'的未处理异常"的运行时异常.exe
其他信息:对象同步方法从未同步的代码块调用。
如何正确使用监视器类。
int total;
private void button3_Click(object sender, EventArgs e)
{
listBox1.Items.Clear();
total = 0;
Thread threadA;
Thread threadB;
threadA = new Thread(sumNumber);
threadA.Start();
threadB = new Thread(sumNumber);
threadB.Start();
threadA.Join();
threadB.Join();
listBox1.Items.Add("Total is: " + total);
}
public void sumNumber()
{
long numRepeats = 100000;
for (int i = 0; i < numRepeats; i++)
{
Monitor.Enter(total);
total = total + 10;
Monitor.Exit(total);
}
}
传递给 Monitor.Enter 和 Monitor.Exit 的对象必须相同。由于总值发生变化,Monitor.Exit 尝试退出,但没有任何相应的 Monitor.Enter 使用相同的对象,从而引发异常
你应该有
private readonly object TotalLock = new object();
作为成员变量,则
Monitor.Enter(TotalLock);
total = total + 10;
Monitor.Exit(TotalLock);
可以缩短为
lock (TotalLock)
{
total = total + 10;
}