1

我只是想确保我正确理解 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
4

2 回答 2

4

不是完全。

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

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

于 2012-09-27T19:01:04.127 回答
0

并不真地。同一块内的代码不会被不同的线程同时执行。当进程到达 SyncLock 结束时,CLR 释放锁。

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

如果很快,您应该始终在锁定语句中使用引用类型,并且该对象必须是非公共的以防止死锁。同样,在简短的回答中很难解释所有这些,我会推荐 Jeffrey Richter 的书“CLR via .Net”——他对这个和其他 .Net 基础主题进行了深入探讨。

于 2012-09-27T19:02:06.840 回答