鎖
lock
為一段程式碼提供執行緒安全性,因此只能在同一程序中的一個執行緒訪問它。例:
private static object _lockObj = new object();
static void Main(string[] args)
{
Task.Run(() => TaskWork());
Task.Run(() => TaskWork());
Task.Run(() => TaskWork());
Console.ReadKey();
}
private static void TaskWork()
{
lock(_lockObj)
{
Console.WriteLine("Entered");
Task.Delay(3000);
Console.WriteLine("Done Delaying");
// Access shared resources safely
Console.WriteLine("Leaving");
}
}
Output:
Entered
Done Delaying
Leaving
Entered
Done Delaying
Leaving
Entered
Done Delaying
Leaving
用例:
每當你有一個程式碼塊,如果同時由多個執行緒執行,可能會產生副作用。lock 關鍵字以及共享同步物件 (示例中為 _objLock
)可用於防止這種情況。
請注意,_objLock
不能是 null
,執行程式碼的多個執行緒必須使用相同的物件例項(通過使其成為 static
欄位,或者通過對兩個執行緒使用相同的類例項)
從編譯器方面來說,lock 關鍵字是一個語法糖,由 Monitor.Enter(_lockObj);
和 Monitor.Exit(_lockObj);
取代。因此,如果你通過使用這兩種方法包圍程式碼塊來替換鎖定,你將獲得相同的結果。你可以在 C#中看到 Syntactic sugar 中的實際程式碼 - 鎖示例