C# 需要同步两个类

C# 需要同步两个类,c#,multithreading,C#,Multithreading,我有两个类A和B。两个类都互相调用并拥有自己的锁。我在一个特定的场景中遇到了僵局。下面是示例代码 class A : Interface1, Interface2 { private B _bInstance = new B(); private object _aSync = new object(); private static A Instance; private A(){} public GetInstance() {

我有两个类A和B。两个类都互相调用并拥有自己的锁。我在一个特定的场景中遇到了僵局。下面是示例代码

class A : Interface1, Interface2
{
    private B _bInstance = new B(); 
    private object _aSync = new object();

    private static A Instance;
    private A(){}

    public GetInstance()
    {
        if (Instance == null)  Instance = new A();
        return Instance;
    }

    void Method1()
    {
        lock(_aSync)
        {
            _bInstance.Method1();
        }
    }

    void WriteData()
    {
        lock (_aSync)
        {
            WriteToFile();
        }
    }
}

class B
{
    private object _bSync = new object();

    void Method1()
    {
        lock (_bSync)
        {
            // Have some code here which need to protect my
            // member variables.
            A.GetInstance.WriteData();
        }
    }

    void OneSecondTimerEvent()
    {
        lock (_bSync)
        {
            // Have some code here which need to protect my
            // member variables.
            A.GetInstance.WriteData();
        }
    }
}

如果在执行
A.Method1()
时触发了1秒计时器,如何同步
OneSecondTimerEvent()

要解决此问题,您可以:

  • 手动订购
    lock
    语句(即,如果A已经有锁,B从不接受额外的锁)
  • 作用域只锁定到每个类的内部状态,从不嵌套锁。在这种情况下,有时需要复制状态来调用外部方法
  • 使用允许这种嵌套的其他同步原语/构造(即读写器锁)

与其尝试解决这个特定的死锁问题(顺便说一句,这是以不一致的顺序锁定事物的典型结果),我强烈建议在a和B之间设计更好的关系。您必须使用静态实例来实现循环依赖,这一事实应该是您做错了什么的一个重要线索。也许A和B应该引用第三类C,它只负责锁定和写入数据?(虽然没有更多的上下文很难说)。

我强烈建议不要使用循环依赖,尤其是在多线程环境中。