两个对象上的SyncLock

时间:2010-08-17 15:07:30

标签: .net synclock

假设我有两个对象 a b

我想在两个对象上使用SyncLock。

这可行吗?它可以通过嵌套的SyncLock语句完成吗?这种手术的危险是什么?

修改

也许我应该问,如何重构以避免死锁?

3 个答案:

答案 0 :(得分:5)

嵌套锁将起作用 - 但是其中一个危险是需要始终以相同的顺序锁定对象,否则可能导致死锁。


编辑: 要回答关于尝试强制锁定的正确顺序的第二个问题:

避免这种情况的可能解决方案可能是将锁定封装到这样的常见锁定方法中:

public void LockAndDoWork(Action action)
{
 lock(lockObject1)
 {
  lock(lockObject2)
  {
    action();
  }
 }
}

然后可以这样使用:

Thread1: LockAndDoWork(() => {do some work....});
Thread2: LockAndDoWork(() => {do some other work...});

这可以帮助避免这个潜在的问题 - 如果可以从客户端代码限制对这些对象的可见性,它会特别有用

答案 1 :(得分:1)

  

也许我应该问,如何重构以避免死锁?

以强大的优先顺序定义所有同步锁,并始终优先考虑最高优先级。

这很难:当一个持有较低优先级锁的代码块可以调用需要获得更高优先级锁的辅助代码时,将需要进行重大的重构。

答案 2 :(得分:0)

这是可能的,但你需要考虑如果运行此代码的2个线程试图同时获得两个锁定会发生什么 - 例如,如果线程1对对象1有锁定而线程2对对象2有锁定?提示死锁。

比我更好的人可以给你一些安全的示例代码:)