2

假设我有两个对象ab

我想在两个对象上同步锁定。

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

编辑

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

4

3 回答 3

5

嵌套锁可以工作——但是危险之一是需要始终以相同的顺序锁定对象,否则可能会导致死锁。


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

避免这种情况的可能解决方案可能是将锁定封装到一个常见的锁定方法中,如下所示:

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

然后可以这样使用:

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

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

于 2010-08-17T15:10:33.137 回答
1

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

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

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

于 2010-08-17T15:57:33.810 回答
0

可以这样做,但您需要考虑如果运行此代码的 2 个线程尝试同时获得两个锁会发生什么 - 例如,如果线程 1 锁定对象 1 而线程 2 锁定对象 2?提示僵局。

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

于 2010-08-17T15:10:10.900 回答