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就是把一段代碼定義為臨界區(臨界區,就是同一時刻隻能有一個線程來操作臨界區的代碼段),當一個線程位于代碼的臨界區時,另一個線程不能進入臨界區,如果試圖進入臨界區,則隻能一直等待(即被阻止),直到已經進入臨界區的線程通路完畢,并釋放鎖旗标。
- class LockView
- {
- //定義一個私有成員變量,用于Lock
- private static object lockobj = new object();
- void DoSomething()
- {
- lock (lockobj)
- {
- //需要鎖定的代碼塊
- }
- }
- }
使用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隻是這段代碼域的标志