C#阻止从其他线程访问所有对象方法

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)


Dan*_*zey 5

单例模式在这里不是正确的 - 它确保只有一个对象的实例,但没有规定如何使用它.

必须在该代码中定义代码的线程安全性.也就是说,如果您无法修改对象的代码,则无法使其正确地保证线程安全.但是,有一种解决方法:您可以将对象包装在您创建的新类中,并确保新对象线程安全的.通过为您不安全的对象的方法公开线程安全的包装器,您可以确保它以您希望的方式访问它.

最简单的方法是使用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)