2

我真的想不出任何

我能想到的一件事是

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

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

另一个我能想到的是

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

在一个线程中和

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

在另一个。我在这里正确吗?

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

4

2 回答 2

4

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

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

于 2012-05-22T16:53:54.277 回答
1

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

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

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

于 2012-05-22T16:56:25.720 回答