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
答案 0 :(得分:0)
不,你的第二个片段根本就是错误的。由于您替换您锁定的对象。因此,另一个线程将对另一个对象进行锁定,因此您根本没有线程安全性。只有当线程使用完全相同的对象来存储锁定状态时,锁才能工作。
值得注意的是您锁定对象的种。你的第二个片段在一个实习字符串上这样做。非常非常糟糕,因为很可能导致死锁。其他地方的任何其他代码可能以相同的方式出错,并且还会对字符串文字进行锁定。如果这恰好是“字符串”,你很容易就会完全无法解决死锁。
还有第一个代码片段的问题,其他代码可能会锁定TheList对象,因为它可能是公共的。出于同样的原因产生死锁。 Boilerplate是您始终使用专用对象来存储未用于其他任何内容的锁定状态,只会出现在访问列表的任何代码中。
Private ListLock As Object = New Object