我在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
)上,始终发生死锁。我还可以告诉我这个委托方法经常被调用。
如何避免此类死锁?
答案 0 :(得分:4)
这意味着你从另一个线程的锁永远不会释放@synchronized(self)
获取的锁 - 你可能正在等待某事完成,这发生在另一个线程上,试图从另一个点保持锁定。寻找这个问题(如果你暂停,你可能会看到在另一个线程上的调试器中等待)。这也表明你的锁被保持很长时间 - 如果你想有效地使用并发,只能持有它们。
答案 1 :(得分:3)
你几乎不应该检查你的课程设计。它不应该发生。 如果发生这种情况,请查看锁定实例的任何关键部分(synchronized())。其中一个永远锁定你的实例。或者,也许,你有交叉锁定(方法M1锁定A,方法M2锁定B,他们想要同时交换锁定),它会导致死锁。