正确使用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();

 

 

 

你可能感兴趣的:(Lock)