需要同步两个类

时间:2015-04-21 19:17:25

标签: 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()
    {
        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();
        }
    }
}

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

2 个答案:

答案 0 :(得分:0)

是的,您的代码显示deadlock的典型示例 - 等待彼此继续的2个资源。

要解决此问题,您可以:

  • 手动命令lock语句(即如果A已经锁定,则B永远不会获取额外的锁定),
  • 范围仅锁定到每个类的内部状态,并且永远不会嵌套锁。在这种情况下,有时您需要复制状态以调用外部方法。
  • 使用允许这种嵌套的其他同步原语/构造(即Reader-Writer锁定)。

答案 1 :(得分:0)

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