如何避免@synchronized(self)死锁?

时间:2012-02-23 18:10:40

标签: objective-c multithreading cocoa synchronization deadlock

我在Objective-C项目中有一些同步。代码如下所示:

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
    //some code
    @synchronized(self) {    //at this line deadlocks
        //some code
    }
    //some code
}

并在此行(@synchronized)上,始终发生死锁。我还可以告诉我这个委托方法经常被调用。

如何避免此类死锁?

2 个答案:

答案 0 :(得分:4)

这意味着你从另一个线程的锁永远不会释放@synchronized(self)获取的锁 - 你可能正在等待某事完成,这发生在另一个线程上,试图从另一个点保持锁定。寻找这个问题(如果你暂停,你可能会看到在另一个线程上的调试器中等待)。这也表明你的锁被保持很长时间 - 如果你想有效地使用并发,只能持有它们。

答案 1 :(得分:3)

你几乎不应该检查你的课程设计。它不应该发生。 如果发生这种情况,请查看锁定实例的任何关键部分(synchronized())。其中一个永远锁定你的实例。或者,也许,你有交叉锁定(方法M1锁定A,方法M2锁定B,他们想要同时交换锁定),它会导致死锁。