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