C# 關於線程鎖lock的使用方法


C# 關於線程鎖lock的使用方法

原創 2016年09月02日 10:07:05

        在多線程編程中,可能會有許多線程並發的執行一段代碼(代碼塊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:

 


免責聲明!

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



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