C#中Lock关键字的使用
C# 中的 Lock 語句通過隱式使用 Monitor 來提供同步功能。lock 關鍵字在塊的開始處調用 Enter,而在塊的結尾處調用 Exit。?
通常,應避免鎖定 public 類型,否則實例將超出代碼的控制范圍。 常見的結構 lock (this)、lock (typeof (MyType)) 和 lock ("myLock") 違反此準則:
- 如果實例可以被公共訪問,將出現 lock (this) 問題。
- 如果 MyType 可以被公共訪問,將出現 lock (typeof (MyType)) 問題。
- 由于進程中使用同一字符串的任何其他代碼都將共享同一個鎖,所以出現 lock(“myLock”) 問題。
???? 最佳做法是定義 private 對象來鎖定, 或 private static 對象變量來保護所有實例所共有的數據。
總結:
1、如果兩個操作是相互影響的,比如讀寫一個文件,只能允許一個執行,則鎖對象應該相同。
????? 因為lock隱含是Monitor, Monitor類通過向單個線程授予對象鎖來控制對對象的訪問。對象鎖提供限制訪問代碼塊(通常稱為臨界區)的能力。當一個線程擁有對象的鎖時,其他任何線程都不能獲取該鎖。還可以使用 Monitor 來確保不會允許其他任何線程訪問正在由鎖的所有者執行的應用程序代碼節,除非另一個線程正在使用其他的鎖定對象執行該代碼。
2、如果兩個操作是互不相干的,則其鎖對象應該不同,如若采用同一個鎖,將直接影響其它操作的執行。
????? 在我們開發過程中,經常為了省事,而只創建一個鎖對象,還有的在基類創建一個鎖,由子類共用,這是在系統架構中采用工廠模式,經常出現的誤區。如果是互不相干的操作,一個操作的執行必須等待另一個操作結束之后才能執行,必然受到了該鎖的影響,大大降低了系統的性能,有時候會造成死鎖。
3、lock本身也有系統損耗。
????? lock本身也需要利用資源,所以不必要的鎖會降低系統的性能。在這個試驗里,加了鎖和不加鎖,執行的結果不一樣,加了鎖輸出的結果會縮短。這個你自己也可以寫一個小例子進行測試。所以使用鎖一定要慎重,不能濫用。
轉載于:https://www.cnblogs.com/jimmymi/p/4553905.html
總結
以上是生活随笔為你收集整理的C#中Lock关键字的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于串口接收数据不全的问题
- 下一篇: iOS开发 tabBarControll