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