欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

如何解決C#lockthis問題

本篇內(nèi)容介紹了“如何解決C# lock this問題”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

成都創(chuàng)新互聯(lián)專注于網(wǎng)站建設(shè),為客戶提供成都網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁設(shè)計開發(fā)服務(wù),多年建網(wǎng)站服務(wù)經(jīng)驗,各類網(wǎng)站都可以開發(fā),高端網(wǎng)站設(shè)計,公司官網(wǎng),公司展示網(wǎng)站,網(wǎng)站設(shè)計,建網(wǎng)站費用,建網(wǎng)站多少錢,價格優(yōu)惠,收費合理。

在以前編程中遇到lock問題總是使用lock(this)一鎖了之,出問題后翻看MSDN突然發(fā)現(xiàn)下面幾行字:通常,應(yīng)避免鎖定 public 類型,否則實例將超出代碼的控制范圍。常見的結(jié)構(gòu) lock (this)、lock (typeof (MyType)) 和 lock ("myLock") 違反此準則:如果實例可以被公共訪問,將出現(xiàn)C# lock this問題。如果 MyType 可以被公共訪問,將出現(xiàn) lock (typeof (MyType)) 問題。由于進程中使用同一字符串的任何其他代碼將共享同一個鎖,所以出現(xiàn) lock(“myLock”) 問題。來看看C# lock this問題:如果有一個類Class1,該類有一個方法用lock(this)來實現(xiàn)互斥:

publicvoidMethod2()  {  lock(this)  {  System.Windows.Forms.MessageBox.Show("Method2End");  }  }

如果在同一個Class1的實例中,該Method2能夠互斥的執(zhí)行。但是如果是2個Class1的實例分別來執(zhí)行Method2,是沒有互斥效果的。因為這里的lock,只是對當前的實例對象進行了加鎖。

Lock(typeof(MyType))鎖定住的對象范圍更為廣泛,由于一個類的所有實例都只有一個類型對象(該對象是typeof的返回結(jié)果),鎖定它,就鎖定了該對象的所有實例,微軟現(xiàn)在建議,不要使用lock(typeof(MyType)),因為鎖定類型對象是個很緩慢的過程,并且類中的其他線程、甚至在同一個應(yīng)用程序域中運行的其他程序都可以訪問該類型對象,因此,它們就有可能代替您鎖定類型對象,完全阻止您的執(zhí)行,從而導(dǎo)致你自己的代碼的掛起。

鎖住一個字符串更為神奇,只要字符串內(nèi)容相同,就能引起程序掛起。原因是在.NET中,字符串會被暫時存放,如果兩個變量的字符串內(nèi)容相同的話,.NET會把暫存的字符串對象分配給該變量。所以如果有兩個地方都在使用lock(“my lock”)的話,它們實際鎖住的是同一個對象。到此,微軟給出了個lock的建議用法:鎖定一個私有的static 成員變量。

.NET在一些集合類中(比如ArrayList,HashTable,Queue,Stack)已經(jīng)提供了一個供lock使用的對象SyncRoot,用Reflector工具查看了SyncRoot屬性的代碼,在Array中,該屬性只有一句話:return this,這樣和lock array的當前實例是一樣的。ArrayList中的SyncRoot有所不同

get  {  if(this._syncRoot==null)  {  Interlocked.CompareExchange(refthis._syncRoot,newobject(),null);  }  returnthis._syncRoot;

其中Interlocked類是專門為多個線程共享的變量提供原子操作(如果你想鎖定的對象是基本數(shù)據(jù)類型,那么請使用這個類),CompareExchange方法將當前syncRoot和null做比較,如果相等,就替換成new object(),這樣做是為了保證多個線程在使用syncRoot時是線程安全的。集合類中還有一個方法是和同步相關(guān)的:Synchronized,該方法返回一個對應(yīng)的集合類的wrapper類,該類是線程安全的,因為他的大部分方法都用lock來進行了同步處理,比如Add方法:

publicoverridevoidAdd(objectkey,objectvalue)  {  lock(this._table.SyncRoot)  {  this._table.Add(key,value);  }  }

這里要特別注意的是MSDN提到:從頭到尾對一個集合進行枚舉本質(zhì)上并不是一個線程安全的過程。即使一個集合已進行同步,其他線程仍可以修改該集合,這將導(dǎo)致枚舉數(shù)引發(fā)異常。若要在枚舉過程中保證線程安全,可以在整個枚舉過程中鎖定集合:

QueuemyCollection=newQueue();  lock(myCollection.SyncRoot){  foreach(ObjectiteminmyCollection){  //Insertyourcodehere.  }  }

“如何解決C# lock this問題”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

網(wǎng)站名稱:如何解決C#lockthis問題
文章出自:http://aaarwkj.com/article18/iidogp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計、自適應(yīng)網(wǎng)站、搜索引擎優(yōu)化、網(wǎng)頁設(shè)計公司、做網(wǎng)站、響應(yīng)式網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

營銷型網(wǎng)站建設(shè)
一区二区三区不卡中文字幕| 精品国产三级a在线观看网站| 亚洲六月丁香六月婷婷| 五月婷婷综合中文字幕在线| 99热精品综合在线观看| 背德人妻中文字幕无修| 不卡的国产在线视频| 日韩亚洲在线中文字幕| 国产三级精品三级专区| 91日本精品免费在线视频| 一级黄片视频免费下载| 男人的天堂成人午夜视频| 岛国av在线免费观看| 亚洲国产日韩欧美视频| 日韩日美日韩av影视| 情五月激情亚洲丁香佳色| 国产一边打电话一边操| 加勒比av免费在线播放| 精品一区二区三区高清| 国产成人综合久久三区北岛玲| 亚洲中文字幕乱码熟女在线| va精品人妻一区二区三区| 最新日韩欧美一区二区| 丁香六月婷婷激情啪啪综合| 久久99国产精品成人免费| 国产精品亚洲精品久久| 色播五月麻豆激情综合网| av一区二区日韩电影| 日本不卡不二三区在线看| 国产精品欧美日韩精品| av久久精品在线观看| 一区二区三区人妻日韩| 欧美v日韩v亚洲综合国产高清| 熟女人妻精品一二三四| 欧美亚洲精品在线观看| 亚洲av色男人天堂网| 亚洲特级黄色做啪啪啪| 亚洲欧美综合另类久久| 国产一区二区在线粉嫩| 在线观看一区二区三区国产视频 | 久久国产精品一区二区三区|