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

C#中實現(xiàn)線程同步lock關鍵字的用法詳解

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

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

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

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

4. 鎖定ICollection類型對象時,應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關鍵字是用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關鍵字相對于Monitor類在使用上更簡單,也更加保險。

相關文章

  • sort page 排序和分頁的小例子

    sort page 排序和分頁的小例子

    花了一上午時間,終于寫了一個進行排序并且分頁的類,下面將代碼貼出來,望大家指正。
    2013-05-05
  • 解答“60k”大佬的19道C#面試題(下)

    解答“60k”大佬的19道C#面試題(下)

    這篇文章主要解答了“60k”大佬的19道C#面試題中的后9道,文中的面試題比較小眾,作者給了不錯的答案,相信對你以后的面試有所幫助,感興趣就來了解下
    2020-06-06
  • Unity?使用tiledmap解析地圖的詳細過程

    Unity?使用tiledmap解析地圖的詳細過程

    這篇文章主要介紹了Unity?使用tiledmap解析地圖,本文通過圖文實例相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • C# 實例化接口對象的方法

    C# 實例化接口對象的方法

    下面小編就為大家?guī)硪黄狢# 實例化接口對象的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • c# 設置TeeChart控件的提示文本

    c# 設置TeeChart控件的提示文本

    這篇文章主要介紹了c# 如何設置TeeChart控件的提示文本,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2020-11-11
  • WPF自定義MenuItem樣式的實現(xiàn)方法

    WPF自定義MenuItem樣式的實現(xiàn)方法

    這篇文章主要給大家介紹了關于WPF自定義MenuItem樣式的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家學習或者使用WPF具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-06-06
  • C#實現(xiàn)驗證碼功能

    C#實現(xiàn)驗證碼功能

    這篇文章主要為大家詳細介紹了C#實現(xiàn)驗證碼功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • c#中文轉unicode字符示例分享

    c#中文轉unicode字符示例分享

    本文介紹了中文轉unicode字符的方法,還有UNICODE字符轉為中文的方法,大家參考使用吧
    2014-01-01
  • 如何在Unity中檢測死循環(huán)和卡死

    如何在Unity中檢測死循環(huán)和卡死

    這篇文章主要介紹了在Unity中檢測死循環(huán)和卡死的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • C#實現(xiàn)的sqlserver操作類實例

    C#實現(xiàn)的sqlserver操作類實例

    這篇文章主要介紹了C#實現(xiàn)的sqlserver操作類,結合具體實例形式分析了C#針對sqlserver數(shù)據(jù)庫進行連接、查詢、更新、關閉等相關操作技巧,需要的朋友可以參考下
    2017-06-06

最新評論