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