我只想确保正确理解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
答案 0 :(得分:4)
不完全。
首先,锁是可重入的,所以如果一个方法调用另一个方法(或递归到同一个方法),你可以同时使用同一个线程。
其次,如果“...代码”包含Monitor.Wait
- 放弃锁定;在这种情况下,您可以在方法中使用两个线程,但只有一个线程处于活动状态。 Wait
调用阻塞,直到等待的线程可以重新获得锁定 - 所以最多只有一个线程“拥有”锁定。
答案 1 :(得分:0)
不是真的。同一块中的代码将不会由不同的线程同时执行。当进程到达SyncLock的末尾时,CLR将释放锁定。
为什么你需要一个“随机”对象(如你所说)需要更多的解释和更深入的理解CLR对象如何构建,在内存中布局和管理。
如果不久,您总是应该在锁定语句中使用引用类型,并且此对象必须是非公共的以防止死锁。同样,在简短的回答中解释所有内容真的很难,我会推荐Jeffrey Richter的书“CLR via .Net” - 他对这个和其他.Net基本主题非常深入。