@synchronized vs lock / unlock

时间:2012-08-13 01:48:50

标签: objective-c multithreading synchronized locks

我是Objective-C的新手。我应该何时使用@synchronized,何时应该使用lock/unlock?我的背景主要是Java。我知道在Java中,获取显式锁可以让您执行更复杂,更广泛和更灵活的操作(相对于发布顺序等),而synchronized关键字强制锁用于块中 - 结构化的方式,他们也必须按照他们被收购的相反顺序释放。 Objective-C中是否有相同的基本原理?

2 个答案:

答案 0 :(得分:4)

许多人会认为以任意顺序锁定/解锁是一个错误,而不是一个功能。也就是说,它很容易导致死锁。

在任何情况下,@synchonized()-lock/-unlock或任何其他互斥锁之间几乎没有区别,除了范围的详细信息。它们昂贵,易碎,容易出错,并且通常会使它们绝对正确,从而导致性能类似于单线程解决方案(但是线程的复杂性)。

新的热点是排队。队列往往重量轻得多,因为它们通常不需要系统调用来进行占用大多数呼叫的“快速路径”操作。他们也倾向于表达意图。

Grand Central Dispatch或NSOperationQueue具体。后者建立在当前OS版本的前者之上。 GCD的API往往较低,但它们非常强大,而且非常简单。 NSOperationQueue更高级别,允许直接表达依赖关系等。

我建议从Cocoa concurrency guide开始。

答案 1 :(得分:1)

你通常是对的。 @synchronized获取一个“附加”到给定对象的锁(@synchronized指令中引用的对象不必是锁定)。与在Java中一样,它定义了一个新块,锁定在开始时进行,并在退出时释放,无论是通过正常离开块还是通过异常。因此,正如您所猜测的那样,锁是从获取中以相反的顺序释放的。