C#锁定内部实现
我知道现在在C#锁定内部实现,c#,multithreading,locking,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 t
C#
lock
中是这样实现的:
bool lockWasTaken = false;
var temp = obj;
try
{
Monitor.Enter(temp, ref lockWasTaken);
{
//body
}
}
finally
{
if (lockWasTaken)
{
Monitor.Exit(temp);
}
}
为什么我们需要这个:
var temp=obj代码>?因为obj
可能会在锁代码的主体内重新分配,并且您显示的代码必须确保它调用Exit
的对象与它调用的Enter
对象相同。简单,如果在监视器之后更改变量。输入调用的
,然后在监视器之前更改变量。退出
以防止它占用变量的副本。即使您也可以在lock
语句中将值设置为null
,但它仍然确保释放先前使用的锁。@BransDs-但是obj=SomeOtherObject()
是显示在锁体内部的有效代码。@BransDs这是什么意思?分配将更改副本。所以,在重新分配temp和obj后,它们将指向不同的东西,请尝试一下