【问题标题】:How does SyncLock Works in .NetSyncLock 如何在 .Net 中工作
【发布时间】:2011-04-22 06:19:00
【问题描述】:

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

但我的问题是lockObjectSyncLock 块中的重要性 例如同时清除myList 我可以用吗

Synclock myList
    myList.Clear
End SyncLock

或者lockObject应该和myList不同?

编辑:

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

【问题讨论】:

    标签: .net vb.net multithreading synclock


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回复。但还有一个问题……从 sysnclock 可以理解的是,锁定是为指定为 lockObject 的对象获得的。如果我将要清除的列表指定为lockObject,编译器不应该在清除它之前获得对列表的独占访问权限吗?
    • @regexhacks:不,编译器不会自动开始为您插入锁。你不希望它——通常你使用来自多个线程的对象,那么你为什么要它增加锁定的成本呢?我不太明白您的第一条评论 - 正如我所说,您需要锁定访问列表的所有地方。到那时,不会可以从多个线程同时访问该列表。
    • 即使我不明白我的第一条评论 :) 还是删除它。
    猜你喜欢
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    相关资源
    最近更新 更多