我知道现在C#
lock
以这种方式实施:
bool lockWasTaken = false;
var temp = obj;
try
{
Monitor.Enter(temp, ref lockWasTaken);
{
//body
}
}
finally
{
if (lockWasTaken)
{
Monitor.Exit(temp);
}
}
为什么我们需要这个:var temp = obj;
?
答案 0 :(得分:1)
因为obj
可能会在锁定代码的正文中重新分配,并且您显示的代码必须确保它在相同的对象上调用Exit
它称为Enter
for。
答案 1 :(得分:1)
简单,如果您在调用Monitor.Enter
之后和Monitor.Exit
之前更改了变量,该怎么办?
防止它占用变量的副本。甚至你也可以在null
语句中将值设置为lock
,但它仍然确保它释放它之前采用的锁。