C# 在拥有的对象上放置锁
我注意到,在我看到的几乎所有示例中,实例上的锁都是按如下方式使用的C# 在拥有的对象上放置锁,c#,.net,multithreading,locking,C#,.net,Multithreading,Locking,我注意到,在我看到的几乎所有示例中,实例上的锁都是按如下方式使用的 public class Foo { readonly object locker = new Object(); public void DoSomething() { lock(locker) { //... } } public void DoSomethingElse() { lock(locker) { //...
public class Foo {
readonly object locker = new Object();
public void DoSomething() {
lock(locker) {
//...
}
}
public void DoSomethingElse() {
lock(locker) {
//...
}
}
}
当多个线程可以访问同一个实例,并且您希望其方法是原子的时,这非常有用
在我的实验中,如果我使用
锁(this)
,而不是使用locker对象,那么它也同样有效。有什么东西我遗漏了吗?或者说完全没问题吗?问题是你对这个
没有独占控制权。其他类型也可能锁定对象并造成严重破坏
微软在他们的网页上对这个问题发表了一些看法
一般情况下,避免锁定公共类型或超出您权限的实例
代码的控制。常见的构造有lock(this)、lock(typeof
(MyType)和锁(“myLock”)违反了本准则:
lock (this) is a problem if the instance can be accessed publicly.
lock (typeof (MyType)) is a problem if MyType is publicly accessible.
lock("myLock") is a problem because any other code in the process using the same string, will share the same lock.
最佳实践是定义要锁定的私有对象或私有对象
静态对象变量,用于保护所有实例共用的数据