Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#锁定内部实现_C#_Multithreading_Locking - Fatal编程技术网

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后,它们将指向不同的东西,请尝试一下