我是Objective-C的新手。我应该何时使用@synchronized
,何时应该使用lock/unlock
?我的背景主要是Java。我知道在Java中,获取显式锁可以让您执行更复杂,更广泛和更灵活的操作(相对于发布顺序等),而synchronized
关键字强制锁用于块中 - 结构化的方式,他们也必须按照他们被收购的相反顺序释放。 Objective-C中是否有相同的基本原理?
答案 0 :(得分:4)
许多人会认为以任意顺序锁定/解锁是一个错误,而不是一个功能。也就是说,它很容易导致死锁。
在任何情况下,@synchonized()
,-lock/-unlock
或任何其他互斥锁之间几乎没有区别,除了范围的详细信息。它们昂贵,易碎,容易出错,并且通常会使它们绝对正确,从而导致性能类似于单线程解决方案(但是线程的复杂性)。
新的热点是排队。队列往往重量轻得多,因为它们通常不需要系统调用来进行占用大多数呼叫的“快速路径”操作。他们也倾向于表达意图。
Grand Central Dispatch或NSOperationQueue
具体。后者建立在当前OS版本的前者之上。 GCD的API往往较低,但它们非常强大,而且非常简单。 NSOperationQueue
更高级别,允许直接表达依赖关系等。
我建议从Cocoa concurrency guide开始。
答案 1 :(得分:1)
你通常是对的。 @synchronized
获取一个“附加”到给定对象的锁(@synchronized
指令中引用的对象不必是锁定)。与在Java中一样,它定义了一个新块,锁定在开始时进行,并在退出时释放,无论是通过正常离开块还是通过异常。因此,正如您所猜测的那样,锁是从获取中以相反的顺序释放的。