dar*_*eir 3 c# multithreading locking
我有一个对象,一次只能由一个Thread使用.例如,我的对象包含3个方法A,B并且C我想要锁定对象(所有方法/属性都被锁定),如果线程访问该方法A.
主要的困难是我无法修改该对象的代码.我必须在我调用对象的地方阻止多线程访问.
我的第一个想法是使用单例模式,但我没有设法让它工作!
Mar*_*ell 10
如果无法更改对象的代码,则必须处理对象外部的锁定.例如,您可以将其封装在另一个类中(可能将其隐藏在接口后面),并让该包装类应用同步:
public class Foo {
private readonly YourType tail;
private readonly object syncLock = new object();
public Foo(YourType tail) {this.tail = tail;}
public A() { lock(syncLock) { tail.A(); } }
public B() { lock(syncLock) { tail.B(); } }
public C() { lock(syncLock) { tail.C(); } }
}
Run Code Online (Sandbox Code Playgroud)
单例模式在这里不是正确的 - 它确保只有一个对象的实例,但没有规定如何使用它.
必须在该代码中定义代码的线程安全性.也就是说,如果您无法修改对象的代码,则无法使其正确地保证线程安全.但是,有一种解决方法:您可以将对象包装在您创建的新类中,并确保新对象是线程安全的.通过为您不安全的对象的方法公开线程安全的包装器,您可以确保它以您希望的方式访问它.
最简单的方法是使用lock关键字.像这样的东西可能会起作用:
public class ThreadSafeThing
{
private UnsafeThing _thing = new UnsafeThing();
private object _syncRoot = new object();
public void DoSomething() // this is your thread-safe version of Thing.DoSomething
{
lock (_syncRoot)
{
_thing.DoSomething();
}
}
}
Run Code Online (Sandbox Code Playgroud)