一、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