在.net中SyncLock是如何工作的?



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

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

吗?
Synclock myList
    myList.Clear
End SyncLock

或lockObject应该不同于myList?

编辑:

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

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

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

请注意,您不应该只在清空时使用锁——您需要在访问列表的任何地方使用它

最新更新