C#中實現(xiàn)線程同步lock關(guān)鍵字的用法詳解
1. lock關(guān)鍵字保證一個代碼塊在執(zhí)行的過程中不會受到其他線程的干擾,這是通過在該代碼塊的運行過程中對特定的對象加互斥鎖來實現(xiàn)的。
2. lock關(guān)鍵字的參數(shù)必須是引用類型的對象。lock對基本數(shù)據(jù)類型如int,long等無效,因為它所作用的類型必須是對象。如果傳入long類型數(shù)據(jù),勢必被轉(zhuǎn)換為Int64結(jié)構(gòu)類型,則加鎖的是全新的對象引用。如果需要對它們進行互斥訪問限制,可以使用System.Threading.Interlocked類提供的方法,這個類是提供原子操作的。
3. lock(this)的使用要慎重。共有類型中使用lock(this),如果新的對象被創(chuàng)建并加鎖,極易造成死鎖。
4. 鎖定ICollection類型對象時,應(yīng)lock其SyncRoot屬性。
SyncRoot屬性在接口ICollection中聲明,其實現(xiàn)方式各不相同。
例如在Collection(System.Collections.ObjectModel)中實現(xiàn)如下:
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等類中實現(xiàn)如下:
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關(guān)鍵字是用Monitor(管程)類實現(xiàn)的
lock(x) { DoSomething(); }
System.Object obj = (System.Object)x; System.Threading.Monitor.Enter(obj); try { DoSomething(); } finally { System.Threading.Monitor.Exit(obj); }
以上兩段代碼是等效的。(MSDN)
使用lock關(guān)鍵字相對于Monitor類在使用上更簡單,也更加保險。
上一篇:C#簡單訪問SQLite數(shù)據(jù)庫的方法(安裝,連接,查詢等)
欄 目:C#教程
本文標題:C#中實現(xiàn)線程同步lock關(guān)鍵字的用法詳解
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/6373.html
您可能感興趣的文章
- 01-10C#通過反射獲取當前工程中所有窗體并打開的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10C#停止線程的方法
- 01-10WinForm實現(xiàn)仿視頻播放器左下角滾動新聞效果的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當前操作系統(tǒng)已安裝軟件變化的方法
- 01-10C#實現(xiàn)多線程下載文件的方法
- 01-10C#實現(xiàn)Winform中打開網(wǎng)頁頁面的方法
- 01-10C#實現(xiàn)遠程關(guān)閉計算機或重啟計算機的方法
- 01-10C#自定義簽名章實現(xiàn)方法


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻播放器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當前操作系統(tǒng)已
隨機閱讀
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-11ajax實現(xiàn)頁面的局部加載
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10C#中split用法實例總結(jié)
- 01-10delphi制作wav文件的方法
- 04-02jquery與jsp,用jquery
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置