天天看点

C#Lock关键字的使用

C# Lock的使用

  对于Lock,MSDN上有关于Lock的解释:

http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=ZH-CN&k=k(LOCK_CSHARPKEYWORD);k(TargetFrameworkMoniker-%22.NETFRAMEWORK%2cVERSION%3dV4.0%22);k(DevLang-CSHARP)&rd=true

从里面可以学到关于Lock的使用方法。

现在,通俗一点讲:lock就是把一段代码定义为临界区(临界区,就是同一时刻只能有一个线程来操作临界区的代码段),当一个线程位于代码的临界区时,另一个线程不能进入临界区,如果试图进入临界区,则只能一直等待(即被阻止),直到已经进入临界区的线程访问完毕,并释放锁旗标。

  1. class LockView  
  2. {  
  3.     //定义一个私有成员变量,用于Lock  
  4.     private static object lockobj = new object();  
  5.     void DoSomething()  
  6.     {  
  7.         lock (lockobj)  
  8.         {  
  9.             //需要锁定的代码块  
  10.         }  
  11.     }  

使用lock需要注意的地方:

1.lock不能锁定空值

某一对象可以指向Null,但Null是不需要被释放的。(请参考:认识全面的null)

2.lock不能锁定string类型,虽然它也是引用类型的。因为字符串类型被CLR“暂留”

这意味着整个程序中任何给定字符串都只有一个实例,就是这同一个对象表示了所有运行的应用程序域的所有线程中的该文本。因此,只要在应用程序进程中的任何位置处具有相同内容的字符串上放置了锁,就将锁定应用程序中该字符串的所有实例。因此,最好锁定不会被暂留的私有或受保护成员。

3.lock锁定的对象是一个程序块的内存边界

4.值类型不能被lock,因为前文标红字的“对象被释放”,值类型不是引用类型的

5.lock就避免锁定public 类型或不受程序控制的对象。

例如,如果该实例可以被公开访问,则 lock(this) 可能会有问题,因为不受控制的代码也可能会锁定该对象。这可能导致死锁,即两个或更多个线程等待释放同一对象。出于同样的原因,锁定公共数据类型(相比于对象)也可能导致问题。

使用lock(this)的时候,类的成员变量的值可能会被不在临界区的方法改值了

对于Lock(this),要特别注意:Lock(this),并不是要lock住this对象,让其他的线程不能操作,相反 this中的属性依然能够被别的线程改变.那我们lock住的是什么? 是代码段,是lock后面大括号中代码段,这段代码让多个人执行是不被允许的。那返回头来在看lock(this),this是什么意思呢?可以说this只是这段代码域的标志

c#