Vb.net 同步锁列表或列表项

Vb.net 同步锁列表或列表项,vb.net,synclock,Vb.net,Synclock,MS参考: SyncLock语句中表达式的类型必须是引用类型,例如类、模块、接口、数组或委托 场景:多线程读取和编辑列表 我知道这样可以避免比赛条件: SyncLock TheList TheList.item(0) = "string" End SyncLock 但这会吗 SyncLock TheList.item(0) TheList.item(0) = "string" End SyncLock 不,你的第二个片段根本上是错误的。因为您正在替换锁定的对象。因此,另一个线程将锁

MS参考:

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

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

我知道这样可以避免比赛条件:

SyncLock TheList
TheList.item(0) = "string"
End SyncLock
但这会吗

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

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

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

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

 Private ListLock As Object = New Object