为什么要锁定Collection.SyncRoot而不是只锁定集合?

ric*_*ard 6 .net icollection syncroot

我试图理解ICollection中syncroot的意义.为什么不直接锁定集合?

lock(myCollection)
{
    //do stuff to myCollection
}
Run Code Online (Sandbox Code Playgroud)

VS

lock(myCollection.SyncRoot)
{
    //do stuff to myCollection
}
Run Code Online (Sandbox Code Playgroud)

Ree*_*sey 8

通常,如果线程安全是一个严重的问题,我会避免这些选项中的任何一个.

一个更好的选择通常是维护自己的私有变量,并在需要的所有方法中锁定它 - 包括访问集合的整个公共API.

真正的危险在于,通过锁定暴露或可能暴露于外部世界的类型,您可能会打开"外部世界"混乱同步的能力.如果使用多个锁,则可能导致死锁(如果外部锁定了您不期望的内容).

通过创建一个私有变量,并专门锁定它,你就"控制"了这种情况.这使得更清楚的是发生了什么.此外,它可以简化多个对象之间的同步,尤其是在您维护代码之后,因为锁定非常清晰.

  • 你既不应暴露集合也不暴露锁. (2认同)