是否存在@synchronized会死锁的示例代码?

时间:2012-05-22 16:52:59

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

我真的想不出任何

我能想到的一件事是

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

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

我能想到的另一个是

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

在一个帖子中

@synchronized (B)
{
@synchronized (A){}
}
另一个。我在这里纠正吗?

如何避免死锁呢?任何简单的规则?

2 个答案:

答案 0 :(得分:4)

我的#1规则永远不会锁定任何公开可见的内容 我的#2规则永远不会在持有锁的情况下调用外部代码。

我发现如果你可以管理这两点,那么任何可能出现的死锁都更容易被发现并且更容易修复。

答案 1 :(得分:1)

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

“最佳”模式是隔离;使交叉线程/队列层尽可能小,并将其后面的所有内容隔离到一个线程。

核心数据就是这种模式的一个很好的例子。托管对象上下文是每个线程,CD通过一个特别好的单元测试基础架构完全在幕后管理并发数据存储。