C#多线程编程之:lock使用注意事项
1.避免鎖定public類型對象。
如果實例可以被公共訪問,將出現lock(this)問題。
如有一個類MyClass,該類有一個Method方法通過lock(this)來實現互斥:
1 public class MyClass2 {
3 public void Method()
4 {
5 lock(this)
6 {
7 ......
8 }
9 }
10 }
如果一個MyClass的實例在不同線程中執行Method方法,可以實現互斥。但如果多個MyClass的實例分別在不同的線程中執行Method方法,互斥將失效,因為此處的lock(this)僅對當前的實例對象進行了加鎖。
2.禁止鎖定類型
lock(typeof(ClassName))鎖定范圍更為廣泛,由于一個類的所有實例都只有一個類型對象(該對象是typeof的返回結果),鎖定它,就鎖定了該對象的所有實例。微軟現在建議(原文請參考:http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/SDaskgui06032003.mspx?mfr=true)不要使用lock(typeof(ClassName))。以下的微軟的原文描述:
首先鎖定類型對象是個很緩慢的過程,并且類中的其他線程、甚至在同一個應用程序域中運行的其他程序都可以訪問該類型對象,因此,它們就有可能代替您鎖定類型對象,完全阻止您的執行,從而導致你自己的代碼的掛起。
這里的基本問題是,您并未擁有該類型對象,并且您不知道還有誰可以訪問它。總的來說,依靠鎖定不是由您創建、并且您不知道還有誰可以訪問的對象是一種很不好的做法。這樣做很容易導致死鎖。
3.禁止鎖定字符串
鎖住一個字符串更為神奇,只要字符串內容相同,就能引起程序掛起。
在.NET中,字符串會被暫時存放,如果兩個變量的字符串內容相同的話,.NET會把暫存的字符串對象分配給該變量。所以如果有兩個地方都在使用lock("my lock")的話,它們實際鎖住的是同一個對象。
如何正確使用lock呢?
微軟給出的建議是:只鎖定私有對象。
示例代碼:?
1 public class MyClass2 {
3 private static Object somePrivateStaticObject = new Object();
4
5 // methods of class go here--can lock somePrivateStaticObject
6 public void Method()
7 {
8 lock(somePrivateStaticObject)
9 {
10 ......
11 }
12 }
13 }
鎖定私有對象的好處:
首先,類以外的任何代碼都無法鎖定MyClass.somePrivateStaticObject,因此避免了許多死鎖的可能。由于死鎖屬于那種最難找到根源的問題,因此,避免發生死鎖的可能是一件很好的事情。
其次,應用程序中只有一份MyClass.somePrivateStaticObject的副本,并且系統上運行的其他每個應用程序也只有一個副本。因此,在同一個應用程序域中的應用程序之間沒有相互影響。
總結
以上是生活随笔為你收集整理的C#多线程编程之:lock使用注意事项的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 备用金一定要用积分吗
- 下一篇: C#多线程lock解决数据同步