国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#中實現線程同步lock關鍵字的用法詳解

2019-10-29 21:24:45
字體:
來源:轉載
供稿:網友

1. lock關鍵字保證一個代碼塊在執行的過程中不會受到其他線程的干擾,這是通過在該代碼塊的運行過程中對特定的對象加互斥鎖來實現的。

2. lock關鍵字的參數必須是引用類型的對象。lock對基本數據類型如int,long等無效,因為它所作用的類型必須是對象。如果傳入long類型數據,勢必被轉換為Int64結構類型,則加鎖的是全新的對象引用。如果需要對它們進行互斥訪問限制,可以使用System.Threading.Interlocked類提供的方法,這個類是提供原子操作的。

3. lock(this)的使用要慎重。共有類型中使用lock(this),如果新的對象被創建并加鎖,極易造成死鎖。

4. 鎖定ICollection類型對象時,應lock其SyncRoot屬性。

SyncRoot屬性在接口ICollection中聲明,其實現方式各不相同。

例如在Collection(System.Collections.ObjectModel)中實現如下:

object ICollection.SyncRoot {      get      {           if (this._syncRoot == null)           {                ICollection items = this.items as ICollection;                if (items != null)                {                     this._syncRoot = items.SyncRoot;                }                else                {                     Interlocked.CompareExchange(ref this._syncRoot, new object(), null);                }           }           return this._syncRoot;      } } 

而在List<T>,ArrayList等類中實現如下:

object ICollection.SyncRoot {      get      {           if (this._syncRoot == null)           {                Interlocked.CompareExchange(ref this._syncRoot, new object(), null);           }           return this._syncRoot;      } }   

在Array類中則直接返回了this:

public object SyncRoot {      get      {           return this;      } } 

5. lock關鍵字是用Monitor(管程)類實現的

lock(x) {   DoSomething(); } 
System.Object obj = (System.Object)x; System.Threading.Monitor.Enter(obj); try {   DoSomething(); } finally {   System.Threading.Monitor.Exit(obj); } 

以上兩段代碼是等效的。(MSDN)

使用lock關鍵字相對于Monitor類在使用上更簡單,也更加保險。


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 陆河县| 玉山县| 安泽县| 揭阳市| 绵竹市| 冕宁县| 喜德县| 靖安县| 敦化市| 嵊泗县| 赤城县| 三都| 布拖县| 揭阳市| 诏安县| 阜宁县| 德钦县| 饶阳县| 苍梧县| 乌鲁木齐县| 庆元县| 临沂市| 陆河县| 团风县| 花莲市| 合作市| 体育| 宜川县| 乡城县| 阳信县| 朝阳县| 申扎县| 宿州市| 英超| 当涂县| 白山市| 克山县| 黄大仙区| 托克托县| 抚远县| 甘德县|