C#多线程任务同步

首先创建全局变量:

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--;
                }
            }
        }

原理都是一样的。

你可能感兴趣的:(C#多线程任务同步)