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 中的实际代码 - 锁示例