假设我有两个对象a和b.
我想在两个对象上使用SyncLock.
这可行吗?它可以通过嵌套的SyncLock语句完成吗?这种手术有哪些危险?
编辑
也许我应该问,一个重构怎么能避免死锁?
嵌套锁将起作用 - 但是其中一个危险是需要始终以相同的顺序锁定对象,否则可能会导致死锁.
编辑:回答关于尝试强制锁的正确顺序的第二个问题:
避免这种情况的可能解决方案可能是将锁定封装到常见的锁定方法中,如下所示:
public void LockAndDoWork(Action action)
{
lock(lockObject1)
{
lock(lockObject2)
{
action();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这可以像这样使用:
Thread1: LockAndDoWork(() => {do some work....});
Thread2: LockAndDoWork(() => {do some other work...});
Run Code Online (Sandbox Code Playgroud)
这可以帮助避免这个潜在的问题 - 如果可以从客户端代码限制对这些对象的可见性,这将特别有用