C#锁定内部实现

时间:2013-12-06 11:55:45

标签: c# multithreading locking

我知道现在C# lock以这种方式实施:

bool lockWasTaken = false;
var temp = obj;
try 
{ 
     Monitor.Enter(temp, ref lockWasTaken); 
     { 
        //body 
     } 
}
finally 
{ 
     if (lockWasTaken) 
     {
         Monitor.Exit(temp); 
      }
}

为什么我们需要这个:var temp = obj;

2 个答案:

答案 0 :(得分:1)

因为obj可能会在锁定代码的正文中重新分配,并且您显示的代码必须确保它在相同的对象上调用Exit它称为Enter for。

答案 1 :(得分:1)

简单,如果您在调用Monitor.Enter之后和Monitor.Exit之前更改了变量,该怎么办?

防止它占用变量的副本。甚至你也可以在null语句中将值设置为lock,但它仍然确保它释放它之前采用的锁。