1. 程式人生 > >C# 關於執行緒鎖lock的使用方法

C# 關於執行緒鎖lock的使用方法

        在多執行緒程式設計中,可能會有許多執行緒併發的執行一段程式碼(程式碼塊A),以提高執行效率。在某些情況下,我們希望A中的程式碼塊(B)同步的執行,即同一時刻只有一個執行緒執行程式碼塊B,這就需要用到鎖(lock)。lock 關鍵字可以用來確保程式碼塊完成執行,而不會被其他執行緒中斷。它可以把一段程式碼定義為互斥段(critical section),互斥段在一個時刻內只允許一個執行緒進入執行,而其他執行緒必須等待。

其寫法如下:

Object  locker = new Object();

lock(locker)

{

      B    //同步執行的程式碼

}

其相當於如下程式碼:

//System.Threading.Moniter.enter(Object),Moniter提供同步訪問物件的機制,enter方法在指定物件上獲取排他鎖,之後其他執行緒不能再次獲取,直到釋放

Monitor.enter(locker); 
{
      B
}
Monitor.exit(locker); 
//exit(Object)釋放指定物件上的排他鎖。

lock 語句的表示式必須表示一個引用型別的值永遠不會為 lock 語句中的表示式執行隱式裝箱轉換,因此,如果該表示式表示的是一個值型別的值,則會導致一個編譯時錯誤。

C#中引用型別主要有:陣列、類、介面、委託、object、字串,但是最好不要鎖字串;使用lock同步時,應保證lock的是同一個物件,而給字串變數賦值並不是修改它,而是重新建立了新的物件,這樣多個執行緒以及每個迴圈之間所lock的物件都不同,因此達不到同步的效果。常用做法是建立一個

object物件,並且永不賦值。

下面舉個簡單的例子,一群苦逼程式設計師被逼捐款,每人100: