正确使用lock 关键字

lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断。这是通过在代码块运行期间为给定对象获取互斥锁来实现的。

我们一般都这样使用lock 关键字

private static object syncObj =new object();
public static void DoTest(){
lock(syncObj){
 //do something 
}
}

至于为什么这样使用参见 http://www.cnblogs.com/jintianhu/archive/2010/11/19/1881494.html

该文章建议将 syncObj 定义为readonly 

下面是我的测试代码 

    class Program
    {
        static void Main(string[] args)
        {
            Thread t1 = new Thread(Test.DoTest);

            Thread t2 = new Thread(Test.DoTest);

            t1.Name = "t1";
            t2.Name = "t2";
            t1.Start();
            Thread.Sleep(300);
            t2.Start();

            Console.ReadLine();

        }
    }
    public class Test { 
        private static object syncObj =new object();
        public static void DoTest(){
            lock(syncObj){
                Console.WriteLine("Curent thread " + Thread.CurrentThread.Name);
                syncObj = 24;  //这里修改了锁定元素的值
                Thread.Sleep(12000);
            }
        }
    }

 

经测试发现,线程1执行完1秒后线程2执行,可见在lock 的区域内是不能对 对象 syncObj 做修改的,为了安全起见,我们修改 syncObj 对象的定义

private static readonly object syncObj =new object();

 

 

 

posted @ 2012-06-13 16:20  但用此心  阅读(574)  评论(0编辑  收藏  举报