天天看點

C# lock關鍵詞/lock語句塊、線程鎖

一、lock關鍵詞說明

1. lock 關鍵字将語句塊标記為臨界區,方法是擷取給定對象的互斥鎖,執行語句,然後釋放該鎖。

2. lock 語句塊鎖定,功能等同于

Monitor.Enter(obj); 
//代碼段
Monitor.Exit(obj);      

3. lock語句塊鎖定和Monitor線程鎖,不能跨程序同步

二、備注

lock

 關鍵字可確定當一個線程位于代碼的臨界區時,另一個線程不會進入該臨界區。 如果其他線程嘗試進入鎖定的代碼,則它将一直等待(即被阻止),直到該對象被釋放。

線程 這節讨論了線程處理。

lock

 關鍵字在塊的開始處調用 Enter,而在塊的結尾處調用 Exit。 ThreadInterruptedException 引發,如果 Interrupt 中斷等待輸入 

lock

 語句的線程。

通常,應避免鎖定 

public

 類型,否則執行個體将超出代碼的控制範圍。 常見的結構 

lock (this)

lock (typeof (MyType))

 和 

lock ("myLock")

 違反此準則:

  • 如果執行個體可以被公共通路,将出現 

    lock (this)

     問題。
  • 如果 

    MyType

     可以被公共通路,将出現 

    lock (typeof (MyType))

  • 由于程序中使用同一字元串的任何其他代碼都将共享同一個鎖,是以出現 

    lock("myLock")

最佳做法是定義 

private

 對象來鎖定, 或 

private static

 對象變量來保護所有執行個體所共有的資料。

在 

lock

 語句的正文不能使用 等待 關鍵字。

三、特别說明

1.lock語句中鎖定的必須是引用類型的對象,不能是值類型

2.為了避免死鎖,lock的對象需要是private對象

3.為了避免lock對象的唯一性,通lock的對象為 private static或者 private readonly static

四、使用示例

private readonly static object _MyLock = new object();
//對于鎖推薦使用靜态私有靜态變量
//private readonly object _MyLock = new object();
/// <summary>
/// 事務, 多表修改
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public bool UpdateName(string name)
{
    lock (_MyLock)
    {
        using (var tran = new TransactionScope())
        {
            ModuleOperate _module = new ModuleOperate();
            //1.修改子產品名稱
            _module.UpdateFirstName("子產品:" + name);
            //2.修改菜單
            this.UpdateFirstName("菜單:" + name);
            //送出事務
            tran.Complete();
        }
    }
    return true;
}      

更多文檔參考:

官方文檔參考

線程鎖詳解

C# 多線程(lock,Monitor,Mutex,同步事件和等待句柄)

C# 線程同步技術(三)之 Monitor 和Lock

繼續閱讀