.net中lock的使用場景


       基本含義:  lock就是把一段代碼定義為臨界區,所謂臨界區就是同一時刻只能有一個線程來操作臨界區的代碼,當一個線程位於代碼的臨界區時,另一個線程不能進入臨界區,如果    試圖進入臨界區,則只能一直等待(即被阻止),直到已經進入臨界區的線程訪問完畢,並釋放鎖旗標

          基本使用方法:

  1. class Test  
  2. {  
  3.     //定義一個私有成員變量,用於Lock  
  4.     private static object lockobj = new object();  
  5.     void DoSomething()  
  6.     {  
  7.         lock (lockobj)  
  8.         {  
  9.             //需要鎖定的代碼塊  
  10.         }  
  11.     }  
  12. }  

使用lock需要注意的地方:

1.lock不能鎖定空值
某一對象可以指向Null,但Null是不需要被釋放的。(請參考:認識全面的null
2.lock不能鎖定string類型,雖然它也是引用類型的。因為字符串類型被CLR“暫留”
這意味着整個程序中任何給定字符串都只有一個實例,就是這同一個對象表示了所有運行的應用程序域的所有線程中的該文本。因此,只要在應用程序進程中的任何位置處具有相同內容的字符串上放置了鎖,就將鎖定應用程序中該字符串的所有實例。因此,最好鎖定不會被暫留的私有或受保護成員。
3.lock鎖定的對象是一個程序塊的內存邊界
4.值類型不能被lock,因為前文標紅字的“對象被釋放”,值類型不是引用類型的

5.lock就避免鎖定public 類型或不受程序控制的對象。
例如,如果該實例可以被公開訪問,則 lock(this) 可能會有問題,因為不受控制的代碼也可能會鎖定該對象。這可能導致死鎖,即兩個或更多個線程等待釋放同一對象。出於同樣的原因,鎖定公共數據類型(相比於對象)也可能導致問題。
使用lock(this)的時候,類的成員變量的值可能會被不在臨界區的方法改值了

           http://www.cnblogs.com/itjeff/p/3904988.html  詳細查看地址


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM