中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何解決C# lock this問題

發布時間:2021-07-15 14:40:30 來源:億速云 閱讀:242 作者:chen 欄目:編程語言

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

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

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

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

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

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

.NET在一些集合類中(比如ArrayList,HashTable,Queue,Stack)已經提供了一個供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類是專門為多個線程共享的變量提供原子操作(如果你想鎖定的對象是基本數據類型,那么請使用這個類),CompareExchange方法將當前syncRoot和null做比較,如果相等,就替換成new object(),這樣做是為了保證多個線程在使用syncRoot時是線程安全的。集合類中還有一個方法是和同步相關的:Synchronized,該方法返回一個對應的集合類的wrapper類,該類是線程安全的,因為他的大部分方法都用lock來進行了同步處理,比如Add方法:

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

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

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

“如何解決C# lock this問題”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

云和县| 宜良县| 岚皋县| 宜川县| 双牌县| 武陟县| 沽源县| 江孜县| 诸暨市| 久治县| 莱州市| 迁西县| 万宁市| 长白| 天台县| 龙州县| 兰坪| 黑龙江省| 绥德县| 乐东| 车致| 通河县| 岱山县| 蓬莱市| 三明市| 南阳市| 枣庄市| 信丰县| 繁昌县| 隆尧县| 唐海县| 阿瓦提县| 东兰县| 平原县| 航空| 林芝县| 湖北省| 阿荣旗| 开阳县| 海门市| 河池市|