欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2016年07月05日 14:37:38   作者:ruozeng  
實現線程同步的第一種方式是我們經常使用的lock關鍵字,它將包圍的語句塊標記為臨界區(qū),這樣一次只有一個線程進入臨界區(qū)并執(zhí)行代碼,接下來通過本文給大家介紹C#中實現線程同步lock關鍵字的用法詳解,一起看看吧

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

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

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

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類在使用上更簡單,也更加保險。

相關文章

  • WPF實現樹形表格控件的示例代碼

    WPF實現樹形表格控件的示例代碼

    這篇文章主要介紹了如何利用WPF框架實現樹形表格控件,該控件不僅能夠有效地展示復雜的層級數據,還能夠提供豐富的個性化定制選項,感興趣的可以了解下
    2024-04-04
  • Visual Studio中根據系統(tǒng)區(qū)分引用64位、32位DLL動態(tài)庫文件的配置方法

    Visual Studio中根據系統(tǒng)區(qū)分引用64位、32位DLL動態(tài)庫文件的配置方法

    這篇文章主要介紹了Visual Studio中根據系統(tǒng)區(qū)分引用64位、32位DLL動態(tài)庫文件的配置方法,本文在VS2008中測試通過,其它VS版本可以參考下
    2014-09-09
  • C#實現DataList里面嵌套DataList的折疊菜單

    C#實現DataList里面嵌套DataList的折疊菜單

    這篇文章主要介紹了C#實現DataList里面嵌套DataList的折疊菜單,以實例形式詳細分析了DataList嵌套實現折疊菜單所涉及的JavaScript、HTML與C#相關使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • c#單例模式(Singleton)的6種實現

    c#單例模式(Singleton)的6種實現

    這篇文章主要介紹了c#單例模式(Singleton)的6種實現 ,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • C# WebClient類用法實例

    C# WebClient類用法實例

    這篇文章主要介紹了C# WebClient類用法實例,本文講解使用WebClient下載文件、OpenWriter打開一個流使用指定的方法將數據寫入到uri以及上傳文件示例,需要的朋友可以參考下
    2015-07-07
  • C#實現圖像選擇驗證碼的示例代碼

    C#實現圖像選擇驗證碼的示例代碼

    為了防止網站被非法登陸,網站一般通過驗證碼的方式,防止黑客用軟件非法登陸,本文主要介紹了C#實現圖像選擇驗證碼的示例代碼,具有一定的參考價值,感興趣的可以了解一下
    2023-08-08
  • 使用C#與SQL Server數據庫進行交互的詳細步驟

    使用C#與SQL Server數據庫進行交互的詳細步驟

    在C#中與數據庫進行交互,通常使用ADO.NET(ActiveX Data Objects .NET)框架,ADO.NET是.NET Framework中用于數據訪問的一組類庫,它提供了多種用于連接和操作數據庫的方法,以下是使用C#與SQL Server數據庫進行交互的詳細步驟,需要的朋友可以參考下
    2024-08-08
  • 詳解.NET 4.0中的泛型協(xié)變(covariant)和反變(contravariant)

    詳解.NET 4.0中的泛型協(xié)變(covariant)和反變(contravariant)

    這篇文章主要介紹了詳解.NET 4.0中的泛型協(xié)變(covariant)和反變(contravariant),本文講解了協(xié)變和反變的背景知識、.NET 4.0引入的泛型協(xié)變、反變性、協(xié)變和反變的相互作用等內容,需要的朋友可以參考下
    2015-06-06
  • Winform控件優(yōu)化之圓角按鈕2

    Winform控件優(yōu)化之圓角按鈕2

    這篇文章主要介紹了Winform控件優(yōu)化之圓角按鈕2,文章通過圍繞主題展開詳細的內容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下
    2022-08-08
  • c# 引用類型和值類型

    c# 引用類型和值類型

    CLR支持兩種類型:引用類型和值類型。引用類型總是從托管堆上分配的
    2012-10-10

最新評論