【问题标题】:Is there a sample code where @synchronized will deadlock?是否有 @synchronized 会死锁的示例代码?
【发布时间】:2012-05-22 16:52:59
【问题描述】:

我真的想不出来

我能想到的一件事是

@synchronized (self)
{
@synchronized (self){}
}

但这不会死锁,因为锁是递归的,只会允许同一个线程通过。所以如果整个程序只使用一个变量,基本上你就不会死锁

我能想到的另一个是

@synchronized (A)
{
@synchronized (B){}
}

在一个线程中

@synchronized (B)
{
@synchronized (A){}
}

在另一个。我说的对吗?

那么如何避免死锁呢?有什么简单的规则吗?

【问题讨论】:

    标签: objective-c multithreading xcode4.3 grand-central-dispatch synchronized


    【解决方案1】:

    我的第一条规则是永远不要锁定任何公开可见的内容。
    我的 #2 规则是永远不要在持有锁时调用外部代码。

    我发现,如果你能处理好这两点,任何可能出现的死锁都更容易被发现和修复。

    【讨论】:

    • 我的规则是只使用一个且只有一个锁,并且对所有人可见。这是另一个好规则。
    【解决方案2】:

    在有共享资源的情况下使用并发没有什么是简单的;总是存在死锁的风险,总是存在由于非原子性而导致数据损坏的风险,并且总是存在由于所有锁定而导致完全并发的代码比单线程代码慢的风险。

    “最好”的模式是孤立;使跨线程/队列层尽可能小,并将其后面的所有内容隔离到单个线程。

    Core Data 就是这种模式的一个很好的例子。托管对象上下文是每个线程的,CD 通过经过非常良好的单元测试的基础设施位完全在幕后管理并发数据存储。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-30
      • 1970-01-01
      • 2012-10-30
      相关资源
      最近更新 更多