C#中完成線程同步lock症結字的用法詳解。本站提示廣大學習愛好者:(C#中完成線程同步lock症結字的用法詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C#中完成線程同步lock症結字的用法詳解正文
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類在應用上更簡略,也加倍保險。