两个SyncLocked代码块是否可以同时执行?

时间:2012-09-27 18:57:43

标签: .net multithreading synchronization

我只想确保正确理解SyncLock。鉴于以下代码,可以安全地说这些块都不会同时执行吗?或者可以肯定地说,在执行任何这些块期间不会执行其他代码?我无法理解SyncLock究竟是什么以及为什么需要一个随机对象来锁定它?

Dim PADLOCK As Object = New Object()

A座:

SyncLock PADLOCK
   '...Code
End SyncLock

B座:

SyncLock PADLOCK
   '...Code
End SyncLock

C座:

SyncLock PADLOCK
   '...Code
End SyncLock

2 个答案:

答案 0 :(得分:4)

不完全。

首先,锁是可重入的,所以如果一个方法调用另一个方法(或递归到同一个方法),你可以同时使用同一个线程

其次,如果“...代码”包含Monitor.Wait - 放弃锁定;在这种情况下,您可以在方法中使用两个线程,但只有一个线程处于活动状态Wait调用阻塞,直到等待的线程可以重新获得锁定 - 所以最多只有一个线程“拥有”锁定。

答案 1 :(得分:0)

不是真的。同一块中的代码将不会由不同的线程同时执行。当进程到达SyncLock的末尾时,CLR将释放锁定。

为什么你需要一个“随机”对象(如你所说)需要更多的解释和更深入的理解CLR对象如何构建,在内存中布局和管理。

如果不久,您总是应该在锁定语句中使用引用类型,并且此对象必须是非公共的以防止死锁。同样,在简短的回答中解释所有内容真的很难,我会​​推荐Jeffrey Richter的书“CLR via .Net” - 他对这个和其他.Net基本主题非常深入。