多线程编程 什么时候使用 lock?

来源:互联网 发布:广电网络三网融合wifi 编辑:程序博客网 时间:2024/06/05 12:48
在多线程编程中最难控制的就是对于同一个对象的并发访问(读写),如果同步没有做到位,可能导致意料之外的情况发生。当所有线程共享一些变量或者对象时,一定要对改变此变量或对象的代码段加锁。
namespace CheckedAndUnchecked{    class Programprivate static  int Count = 0;        static void Main(string[] args)        {            Thread thread1 = new Thread(new ThreadStart(Method));            thread1.Start();            Thread thread2 = new Thread(new ThreadStart(Method));            thread2.Start();        }        static void Method()        {            for(int i = 0; i < 10; i++)            {                int curVal = ++Count;                Thread.Sleep(100);                string output = string.Format("当前线程curVal :{0}, 当前Count:{1}", curVal, Count);            }        }       }}
输出的curVal 和Count通常不等,说明Count被其他线程篡改了。要避免本线程正在使用的共享变量和对象被其他线程篡改,可以使用lock语句对该段程序加锁。
 private static object MethodLock = new object(); static void Method(){    for(int i = 0; i < 10; i++)    {        lock(MethodLock )        {            int curVal = ++Count;            Thread.Sleep(100);            string output = string.Format("当前线程curVal :{0}, 当前Count:{1}", curVal, Count);        }    }}      
0 0
原创粉丝点击