假设我有两个对象a和b。
我想对这两个对象进行SyncLock。
这可行吗?它可以通过嵌套的SyncLock语句来完成吗?这样的行动有什么危险?
编辑
也许我应该问,如何才能重构以避免死锁?
发布于 2010-08-17 15:10:33
嵌套锁将起作用--然而,其中一个危险是,需要始终以相同的顺序锁定对象,否则可能会导致死锁。
编辑:要回答第二个问题,尝试强制正确的锁顺序:
避免这种情况的一个可能的解决方案可能是将锁定封装到一个常见的锁方法中,如下所示:
public void LockAndDoWork(Action action)
{
lock(lockObject1)
{
lock(lockObject2)
{
action();
}
}
}这样就可以这样使用:
Thread1: LockAndDoWork(() => {do some work....});
Thread2: LockAndDoWork(() => {do some other work...});这可以帮助避免这个潜在的问题--如果可以将可见性限制在客户机代码中的那些对象上,则特别有用
发布于 2010-08-17 15:57:33
也许我应该问,如何才能重构以避免死锁?
按强优先级定义所有同步锁,并始终以最高优先级为先。
这很难:当一个持有较低优先级锁的代码块可以调用需要使用较高优先级锁的助手代码时,就需要进行重要的重构。
发布于 2010-08-17 15:10:10
这是可能的,但您需要考虑如果两个线程运行这段代码,同时尝试同时获得两个锁,例如,如果线程1在对象1上有锁,而线程2在对象2上有锁,那么会发生什么呢?暗示僵局。
比我更好的人可以给出一些应该是安全的示例代码:)
https://stackoverflow.com/questions/3503919
复制相似问题