引用:https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/statements/lock
lock 语句获取给定对象的互斥 lock,执行语句块,然后释放 lock。 持有 lock 时,持有 lock 的线程可以再次获取并释放 lock。 阻止任何其他线程获取 lock 并等待释放 lock。 lock 语句可确保单个线程具有对该对象的独占访问权限。
lock 语句具有以下格式
lock (x)
{
// Your code...
}
其中 x 是引用类型的表达式。 它完全等同于
object __lockObj = x;
bool __lockWasTaken = false;
try
{
System.Threading.Monitor.Enter(__lockObj, ref __lockWasTaken);
// Your code...
}
finally
{
if (__lockWasTaken) System.Threading.Monitor.Exit(__lockObj);
}
由于该代码使用 try...finally 块,即使在 lock 语句的正文中引发异常,也会释放 lock。
在 lock 语句的正文中不能使用 await 运算符。
当同步对共享资源的线程访问时,请锁定专用对象实例(例如,private readonly object balanceLock = new object();)或另一个不太可能被代码无关部分用作 lock 对象的实例。 避免对不同的共享资源使用相同的 lock 对象实例,因为这可能导致死锁或锁争用.
具体而言,请避免将以下类型用作 lock 对象:
this(调用方可能将其用作 lock)。
Type 实例(因为这些对象可以通过 typeof 运算符或反射获取)。
字符串实例,包括字符串文本,(因为字符串字面量可能是暂存的)。
尽可能缩短持有锁的时间,以减少锁争用。