1

微软参考: http: //msdn.microsoft.com/en-us/library/3a86s51t (v=vs.71).aspx

“SyncLock 语句中表达式的类型必须是引用类型,例如类、模块、接口、数组或委托。”

场景:多个线程读取和编辑列表。

我知道这将避免竞争条件:

SyncLock TheList
TheList.item(0) = "string"
End SyncLock

但这会吗?

SyncLock TheList.item(0)
     TheList.item(0) = "string"
End SyncLock
4

1 回答 1

0

不,您的第二个片段从根本上是错误的。由于您要替换锁定的对象。因此,另一个线程将锁定另一个对象,因此您根本没有线程安全性。只有当线程使用完全相同的对象来存储锁状态时,锁才能工作。

值得注意的是您锁定的对象类型。您的第二个片段在一个实习字符串上执行此操作。非常非常糟糕,因为很可能导致死锁。其他任何地方的任何其他代码都可能以同样的方式出错,并且也会锁定字符串文字。如果这也恰好是“字符串”,那么您将很容易获得完全无法诊断的死锁。

还有你的第一个片段的问题,其他代码可能会锁定 TheList 对象,因为它可能是公共的。出于同样的原因产生死锁。样板是您始终使用专用对象来存储不用于其他任何事情的锁定状态,只会出现在访问列表的任何代码中。

 Private ListLock As Object = New Object
于 2013-06-24T13:52:19.567 回答