【问题标题】:Can two SyncLocked code blocks, which are Locked with a same object, ever execute at the same time?两个被同一个对象锁定的 SyncLocked 代码块可以同时执行吗?
【发布时间】:2012-09-27 18:57:42
【问题描述】:

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

【问题讨论】:

标签: .net multithreading synchronization


【解决方案1】:

不完全。

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

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

【讨论】:

  • 所以说块 A 包含一些遍历某个列表并在 ThreadA 中运行的代码。然后说 ThreadB 调用 BlockB 试图将对象添加到列表中会发生什么? ThreadB 是否等待 ThreadA 解锁?
  • @vanattab 是的——只要 A 不调用 Monitor.Wait,那么 ThreadA 将被阻塞,直到 ThreadA 到达 SyncLock 的末尾
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多