日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#多线程编程之:lock使用注意事项

發(fā)布時間:2024/9/20 C# 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#多线程编程之:lock使用注意事项 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.避免鎖定public類型對象。

  如果實例可以被公共訪問,將出現(xiàn)lock(this)問題。

  如有一個類MyClass,該類有一個Method方法通過lock(this)來實現(xiàn)互斥:

1 public class MyClass
2 {
3 public void Method()
4 {
5 lock(this)
6 {
7 ......
8 }
9 }
10 }

  如果一個MyClass的實例在不同線程中執(zhí)行Method方法,可以實現(xiàn)互斥。但如果多個MyClass的實例分別在不同的線程中執(zhí)行Method方法,互斥將失效,因為此處的lock(this)僅對當(dāng)前的實例對象進行了加鎖。

2.禁止鎖定類型

  lock(typeof(ClassName))鎖定范圍更為廣泛,由于一個類的所有實例都只有一個類型對象(該對象是typeof的返回結(jié)果),鎖定它,就鎖定了該對象的所有實例。微軟現(xiàn)在建議(原文請參考:http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/SDaskgui06032003.mspx?mfr=true)不要使用lock(typeof(ClassName))。以下的微軟的原文描述:

  首先鎖定類型對象是個很緩慢的過程,并且類中的其他線程、甚至在同一個應(yīng)用程序域中運行的其他程序都可以訪問該類型對象,因此,它們就有可能代替您鎖定類型對象,完全阻止您的執(zhí)行,從而導(dǎo)致你自己的代碼的掛起。

  這里的基本問題是,您并未擁有該類型對象,并且您不知道還有誰可以訪問它。總的來說,依靠鎖定不是由您創(chuàng)建、并且您不知道還有誰可以訪問的對象是一種很不好的做法。這樣做很容易導(dǎo)致死鎖。

3.禁止鎖定字符串

  鎖住一個字符串更為神奇,只要字符串內(nèi)容相同,就能引起程序掛起。

  在.NET中,字符串會被暫時存放,如果兩個變量的字符串內(nèi)容相同的話,.NET會把暫存的字符串對象分配給該變量。所以如果有兩個地方都在使用lock("my lock")的話,它們實際鎖住的是同一個對象。

如何正確使用lock呢?

  微軟給出的建議是:只鎖定私有對象。

  示例代碼:?

1 public class MyClass
2 {
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,因此避免了許多死鎖的可能。由于死鎖屬于那種最難找到根源的問題,因此,避免發(fā)生死鎖的可能是一件很好的事情。

  其次,應(yīng)用程序中只有一份MyClass.somePrivateStaticObject的副本,并且系統(tǒng)上運行的其他每個應(yīng)用程序也只有一個副本。因此,在同一個應(yīng)用程序域中的應(yīng)用程序之間沒有相互影響。

總結(jié)

以上是生活随笔為你收集整理的C#多线程编程之:lock使用注意事项的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。