2011-11-21 41 views
2

编辑:事实证明,当我在浏览我发现了一个问题似乎是和我一样,我没有发现更早:Difference between lock(locker) and lock(variable_which_I_am_using)正在使用现有对象而不是创建特定的锁对象安全吗?

我在看一些代码,并试图围绕让我的头锁定的东西,我到了那里我想。

现在我在一些代码注意到我检讨了对象时,像这样创建:

private HashSet<Graphic> clustersInUse = new HashSet<Graphic>(); 

然后进一步在代码中使用像这样:

lock (clustersInUse) 
{ 
    // Do something with the Hashset 
} 

现在,有一个这样做的问题,而不是为锁创建一个特定的对象。就像这样:

private object clusterLocker = new object(); 

一下如果上面不知何故clustersInUse被放到一个公共财产,那么,什么情况?

此外,如果有东西试图访问clustersInUse而不锁定它,而它被锁定在另一个线程中会发生什么呢?

回答

2

你几乎已经回答了你自己的问题。对于锁定,通常最好创建一个专门用于该目的的对象,并且通常私下使用由高级别表示同步逻辑的访问器方法使用。

+0

因此,基本上所有的问题或潜在的问题是,为什么总的来说最好只是创建一个特定的锁定对象?是否有任何情况下可以使用对象本身?也许是表现还是什么? – Firedragon

+1

@Firedragon:它总是好的*不*使用对象本身。不要让生活复杂化。 –

2

一般规则是,您要控制锁定对象的范围,以防止某些未知代码导致意外行为。在这种情况下,您正在使用一个私有实例变量,因此只要您不提供对其的引用,您可能就行。

如果您正在分发引用并锁定引用并且其他代码正在锁定这些引用(例如,修改集合时),那么更改行为可能会轻松引入线程错误。

如果有人将它放入一个公共属性中,如果它们锁定了它,就会被视为“发放引用”,那么您的锁定呼叫将被阻止,直到它们解锁为止。这是否合意取决于他们在收藏中所做的事情。

锁定对象对于将其用于除同步之外的任何其他目的都没有任何影响。

相关问题