首先创建全局变量:
int count =0;object monitorObject = new object();
创建两个任务:
public void Task01(){for (int i = 0; i < 1900000; i++){Monitor.Enter(monitorObject);//避免多线程对资源的竞争,导致数据不同步,利用Monitor.Enter获取指定对象排他锁。//加锁是耗时的。count++;Console.WriteLine(\"Thread01:\" + i);Monitor.Exit(monitorObject);//释放指定对象的排他锁。}}public void Task02(){for (int i = 0; i < 1900000; i++){Monitor.Enter(monitorObject);//避免多线程对资源的竞争,导致数据不同步,利用Monitor.Enter获取指定对象排他锁。count--;Console.WriteLine(\"Thread02:\" + i);Monitor.Exit(monitorObject);//释放指定对象的排他锁。}}
控制台程序启动多线程,并打印count的值:
Task t1 = Task.Run(Task01);Task t2 = Task.Run(Task02);t1.Wait();t2.Wait();Console.WriteLine(\"count的值:\" + count);Console.ReadLine();
若果没有,由于多线程的资源竞争,count的结果是不准确的,前提是循环的次数足够大。
Monitor.Enter(monitorObject);Monitor.Exit(monitorObject);
也可以简单的利用lock
public void Task01(){for (int i = 0; i < 1900000; i++){lock (monitorObject){count++;}}}public void Task02(){for (int i = 0; i < 1900000; i++){lock (monitorObject){count--;}}}
原理都是一样的。