2012-02-10 80 views
3

如果我有以下代码:C#锁定恢复/继续/打破

lock(SyncRoot){ return value; } 

将SyncRoot上被return语句之前解锁?

我尝试了解VS2005中的代码,但实际上并没有表现出这种或那种方式。它看起来像解开它,但我想确保。

回答

3

是的,无论您如何退出该块(即返回,休息,抛出等),它都会解锁。

详情请参阅MSDN - lock statement

lock关键字可确保在另一个线程处于临界区一个线程不会进入代码的临界段。
...
lock关键字调用在块的开始处输入并在 结束处退出。

2

是的,它计算值(如果值是一个表达式,这可能很重要),然后解锁并返回。无论您如何操作,锁定()始终会在您退出其范围时自动解锁。

1

它将在块执行后解锁。

此语法类似于using,顺便说一句。 lock在块之外的唯一原因是要显示在启动时有一个锁,在结束时解锁功能。

0

不,锁只释放返回声明。

3

是的,你可以把它扩展到像这样的:

Monitor.Enter(obj); 
try { 
    var result = value; 
} 
finally { 
    Monitor.Exit(obj); 
} 
return result; 

如果你看一下生成的IL,它是类似的东西。如果value是一个表达式,它将在释放锁之前进行评估。释放锁后执行返回。

在任何情况下都会调用finally块,所以是的,锁被释放。

2

请记住,lock实际上在后台使用了Monitor.Enter/Monitor.Exit。你的代码的扩展版本,其实这

Monitor.Enter (SyncRoot); 
try 
{ 
    return value; 
} 
finally { Monitor.Exit (SyncRoot); } 

finally块是保证方法实际上返回之前执行,所以锁被释放。

1

如果你有类似` int i = 0; object o = new object();

 while (i < 100) 
     { 
      lock (o) 
      { 
       if (i == 10) 
        continue; 
      } 

      ++i; 
     }` 

这将导致死锁,因为 它会永远等待获取 锁从以前的执行 背景下保存继续