首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >两个对象上的SyncLock

两个对象上的SyncLock
EN

Stack Overflow用户
提问于 2010-08-17 15:07:30
回答 3查看 956关注 0票数 2

假设我有两个对象a和b。

我想对这两个对象进行SyncLock。

这可行吗?它可以通过嵌套的SyncLock语句来完成吗?这样的行动有什么危险?

编辑

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

EN

回答 3

Stack Overflow用户

发布于 2010-08-17 15:10:33

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

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

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

代码语言:javascript
复制
public void LockAndDoWork(Action action)
{
 lock(lockObject1)
 {
  lock(lockObject2)
  {
    action();
  }
 }
}

这样就可以这样使用:

代码语言:javascript
复制
Thread1: LockAndDoWork(() => {do some work....});
Thread2: LockAndDoWork(() => {do some other work...});

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

票数 5
EN

Stack Overflow用户

发布于 2010-08-17 15:57:33

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

按强优先级定义所有同步锁,并始终以最高优先级为先。

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

票数 1
EN

Stack Overflow用户

发布于 2010-08-17 15:10:10

这是可能的,但您需要考虑如果两个线程运行这段代码,同时尝试同时获得两个锁,例如,如果线程1在对象1上有锁,而线程2在对象2上有锁,那么会发生什么呢?暗示僵局。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3503919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档