Synclock列表或ListItem

时间:2013-06-24 08:20:35

标签: vb.net synclock

MS参考: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

1 个答案:

答案 0 :(得分:0)

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

值得注意的是您锁定对象的。你的第二个片段在一个实习字符串上这样做。非常非常糟糕,因为很可能导致死锁。其他地方的任何其他代码可能以相同的方式出错,并且还会对字符串文字进行锁定。如果这恰好是“字符串”,你很容易就会完全无法解决死锁。

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

 Private ListLock As Object = New Object