0

我有一个由多个线程共享的对象列表,它有时会在尝试时生成 IndexOutOfRangeException Clear。在寻找解决方案时,我发现我应该在访问列表时使用 SyncLock。

但是我的问题是lockObjectSyncLock块中的重要性是什么,例如在清除myList 时我可以使用

Synclock myList
    myList.Clear
End SyncLock

或 lockObject 应该与 myList 不同?

编辑:

我对 sysnclock 的看法是“为指定为 lockObject 的对象获得了锁”。如果我将要清除的列表指定为lockObject,编译器不应该在清除它之前获得对列表的独占访问权限吗?

4

1 回答 1

4

选择是任意的 - 引用可以完全独立于您在块中访问的数据,或者您可以使用列表引用之类的东西。

就我个人而言,我喜欢保留一个单独的对象,仅用于锁定目的——如果它是一个私有的只读变量,你知道类外的任何代码都不会锁定在同一个监视器上。当然,如果您有许多不同的代码访问相同的共享数据,您可能需要更广泛地公开锁 - 但通常最好将需要获取锁的所有操作封装在一个类中,然后保留锁本身是私有的。

请注意,您不应该只使用锁定来清除 - 您需要在访问列表的任何地方使用它。

于 2011-04-22T06:23:50.543 回答