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 中的實際程式碼 - 鎖示例