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