首先创建全局变量:
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--;
}
}
}
原理都是一样的。