0

通常,要在多线程时访​​问共享变量,我们需要执行以下操作并对其进行同步:

'''This is VB code. 
'Lock variable to request access and wait. 
Monitor.Enter(list1)
Try
    list1.item(i) = 42
Finally
  Monitor.Exit(Me)
End Try

但是在这种情况下,我需要将元素添加到特定位置的列表中i吗?这个i值只会被编辑一次,所以我不需要担心索引被改变两次。

如果我设置的是 Array 或 ArrayList,会发生什么?如果我确定不两次编辑索引,使用什么最快?

4

2 回答 2

1

修改 List 的元素不会以任何方式改变 List 对象的内部状态。换句话说,代码不能破坏 List 对象本身,因此不需要锁定。

但是,当另一个迭代 List 的线程能够观察到更改的元素时,这是完全不可预测的。很有可能它会看到列表元素的陈旧或部分更新的值。元素类型非常重要,它需要是原子的,以避免另一个线程看到部分更新的值的情况。只有整数或更少的值类型和引用类型引用才能保证是原子的。陈旧性和原子性问题几乎总是需要锁定以避免不可调试和随机故障。

于 2013-10-24T17:02:32.727 回答
0

如果你不担心多个线程改变同一个对象,你甚至不需要做锁定。我不认为我曾经对已经存在的项目使用锁定(除了非常特殊的情况),只是为了改变我的数组/集合的大小(在这种情况下)。

顺便说一句,你应该看看SYNCLOCK它们本质上是一样的。MS 说,“Enter 和 Exit 方法提供的功能与 C# lock 语句(Visual Basic 中的 SyncLock)提供的功能相同,除了 lock 和 SyncLock 将 Exit 方法包装在 try...finally 块中(Try...Finally 在Visual Basic) 以确保释放监视器。”

于 2013-10-24T15:53:52.870 回答