《CLR Via C# 第3版》筆記之(二十三) - 執行緒鎖和執行緒安全的概念

weixin_33860553發表於2012-06-12

執行緒中最繁瑣的應該要算執行緒同步的問題,在理解執行緒同步之前,首先需要了解執行緒同步中經常提及的2個概念。

即執行緒鎖和執行緒安全。

主要內容:

  • 執行緒鎖
  • 執行緒安全

 

1. 執行緒鎖

首先明確的是,執行緒鎖是迫不得已而使用的技術。也就是說,在多執行緒中應用中,應儘量構造不用使用執行緒鎖的方法。

執行緒鎖主要有以下3個問題:

  1. 容易出錯:使用執行緒鎖的程式碼稍不留神就會出錯,而且由於是多執行緒的環境,錯誤不一定會每次都出現,很難除錯。
  2. 損害效能:增加了獲取和釋放鎖的操作,顯然影響了效能。
  3. 阻塞執行緒:鎖的意義在於使得多個執行緒依次訪問某個資源,所以必然帶來執行緒的阻塞,甚至導致死鎖。

 

避免使用執行緒鎖有以下注意事項:

  1. 儘量避免使用一些共享資料(比如 static 變數)可以較少執行緒鎖。
  2. 對共享資料的只有只讀訪問的話也不用加鎖。
  3. 在方法的引數中儘量嘗試使用值型別,每個執行緒都會對值型別進行復制,線上程內部使用其副本,從而不用加鎖。
  4. 執行緒內部new出的物件只要不被其他執行緒使用,也不用加鎖。

 

當然,執行緒鎖雖然有這樣那樣的缺點,也不是完全禁止使用。只是每個使用的執行緒鎖的地方都要斟酌一下。

 

2. 執行緒安全

執行緒安全是指當2個或2個以上的執行緒同時訪問資料時,不會對這個資料造成破壞,造成資料前後不一致的情況。

微軟的FCL(Framework Class Library)保證其中的每個static方法都是執行緒的安全的,但是不保證例項方法是執行緒安全的。

我們在構造自己的Library時也可以參考這個原則。

使用執行緒鎖及執行緒同步的目的都是為了保證執行緒安全。

相關文章