執行緒中最繁瑣的應該要算執行緒同步的問題,在理解執行緒同步之前,首先需要了解執行緒同步中經常提及的2個概念。
即執行緒鎖和執行緒安全。
主要內容:
- 執行緒鎖
- 執行緒安全
1. 執行緒鎖
首先明確的是,執行緒鎖是迫不得已而使用的技術。也就是說,在多執行緒中應用中,應儘量構造不用使用執行緒鎖的方法。
執行緒鎖主要有以下3個問題:
- 容易出錯:使用執行緒鎖的程式碼稍不留神就會出錯,而且由於是多執行緒的環境,錯誤不一定會每次都出現,很難除錯。
- 損害效能:增加了獲取和釋放鎖的操作,顯然影響了效能。
- 阻塞執行緒:鎖的意義在於使得多個執行緒依次訪問某個資源,所以必然帶來執行緒的阻塞,甚至導致死鎖。
避免使用執行緒鎖有以下注意事項:
- 儘量避免使用一些共享資料(比如 static 變數)可以較少執行緒鎖。
- 對共享資料的只有只讀訪問的話也不用加鎖。
- 在方法的引數中儘量嘗試使用值型別,每個執行緒都會對值型別進行復制,線上程內部使用其副本,從而不用加鎖。
- 執行緒內部new出的物件只要不被其他執行緒使用,也不用加鎖。
當然,執行緒鎖雖然有這樣那樣的缺點,也不是完全禁止使用。只是每個使用的執行緒鎖的地方都要斟酌一下。
2. 執行緒安全
執行緒安全是指當2個或2個以上的執行緒同時訪問資料時,不會對這個資料造成破壞,造成資料前後不一致的情況。
微軟的FCL(Framework Class Library)保證其中的每個static方法都是執行緒的安全的,但是不保證例項方法是執行緒安全的。
我們在構造自己的Library時也可以參考這個原則。
使用執行緒鎖及執行緒同步的目的都是為了保證執行緒安全。