Lock的用法,为什么要用?

当多个进程分享数据的时候,对某段程序代码要lock(当对分享数据进行改写的时候)。

我们先看些这段代码:

namespace ThreadTest
{
    class Program
    {
        static bool done;
        static void Main(string[] args)
        {
            new Thread(Go).Start();
            Go();                    
            Console.ReadKey();
        }
        static void Go()
        {
            if (!done)
            {
                done = true;
                Console.WriteLine("Done");
            } 
}
}
}

字段“Done”是两个进程分享的,所以结果输出一个“Done”;但是我们如果把两句程序颠倒一下:

        static void Go()
        {
            if (!done)
            {
                Console.WriteLine("Done");
                done = true;
            }
        }

一个进程还没来得及把"done"设置为true的时候,另一个进程可能已经输出了,这就大大的加大了输出两个Done的可能性。

 

所以,我们需要lock,当给共享变量赋值的时候,可以给程序锁住,这样另一个进程就只能等待,直到lock解除。

        static bool done;
        static readonly object locker = new object();
        static void Main(string[] args)
        {
            new Thread(Go).Start();
            Go();                    
            Console.ReadKey();
        }
        static void Go()
        {
            lock(locker)
            {
                if (!done)
                {
                    Console.WriteLine("Done");
                    done = true;
                }
            }
        }

 

posted @ 2016-10-21 10:48  HepburnXiao  阅读(486)  评论(0编辑  收藏  举报