class Program
{
static void Main(string[] args)
{
Thread thread1 = new Thread((ThreadStart)DLockSample.FunctionA);
Thread therad2 = new Thread((ThreadStart)DLockSample.FunctionB);
thread1.Start();
therad2.Start();
}
}
public class DLockSample
{
static object object1 = new object();
static object object2 = new object();
public static void FunctionA()
{
lock (object1)
{
Thread.Sleep(1000);
lock (object2)
{
Thread.Sleep(1000);
Console.WriteLine("heart beat - object2");
}
}
}
public static void FunctionB()
{
lock (object2)
{
lock (object1)
{
Thread.Sleep(1000);
Console.WriteLine("heart beat - object1");
}
}
} }
-1
A
回答
1
总是在所有线程中以相同的顺序输入锁。也参见hierarchy of critical sections即, FunctionB需要是:
public static void FunctionB()
{
lock (object1)
{
lock (object2)
...
+0
是的,现货... – 2011-02-02 12:22:31
+0
我同意。但是代码块有意模拟场景,我们应该能够提出一些合适的解决方案。 – sawer 2011-02-02 12:23:47
1
这是一个很好的解决问题的方法。只是一些使用技巧:
- 总是以相同的顺序
- 如果它是不可能以相同的顺序锁定,使用对象的字段保存顺序(例如,如果A.Id> B.上的对象锁定Id然后在B之前始终锁定A)。
相关问题
- 1. 我该如何解决这个明显的EhCache死锁?
- 2. 我该如何解决这个问题?
- 3. 我该如何解决这个问题?
- 4. 我该如何解决这个问题?
- 5. 我该如何解决这个问题?
- 6. 我该如何解决这个问题?
- 7. 我该如何解决这个问题?
- 8. 我该如何解决这个问题?
- 9. 我该如何解决这个问题?
- 10. 我该如何解决这个问题
- 11. 我该如何解决这个问题?
- 12. 我该如何解决这个问题?
- 13. 我该如何解决这个问题?
- 14. 我该如何解决这个问题?
- 15. F#解决死锁问题
- 16. 如何解决这个死锁?
- 17. 明显死锁c3p0问题
- 18. 问题与编码,我该如何解决这个问题?
- 19. 如何重构这个死锁问题?
- 20. 跳过我的代码,我该如何解决这个问题?
- 21. 这是什么错误?我该如何解决这个问题?
- 22. 我该如何解决这个问题?我在程序
- 23. 我该如何解决这个触摸事件/绘制循环“死锁”?
- 24. 解决核心数据死锁问题?
- 25. 错误:不是一个声明,我该如何解决这个问题?
- 26. 我该如何使用mysql查询来解决这个问题?
- 27. 我如何解决这个plist问题?
- 28. 我该如何解决这个简单的C溢出问题?
- 29. 我应该如何解决这个问题? $ _GET中的符号
- 30. 我该如何解决这个问题htaccess的
这显然是故意的。这不是很有趣,只需交换FunctionB中的锁。如果您想要教育答案,请务必使用[作业]标签。 – 2011-02-02 13:06:54