我有两个班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()
答案 0 :(得分:0)
是的,您的代码显示deadlock的典型示例 - 等待彼此继续的2个资源。
要解决此问题,您可以:
lock
语句(即如果A已经锁定,则B永远不会获取额外的锁定),答案 1 :(得分:0)
而不是试图解决这个特定的死锁问题(顺便说一下,这是以不一致的顺序锁定事物的经典结果),我强烈建议设计A和B之间更好的关系。事实上你必须使用静态实现循环依赖的实例应该是一个很大的线索,你做错了什么。也许A和B应该引用第三类C,它只负责锁定和写入数据? (虽然如果没有更多的背景,很难说)。