使用NSLocks作为原子或非原子属性?

时间:2014-07-10 09:27:19

标签: objective-c nslock

我应该将NSLock声明为原子,或者它只是浪费时间而且锁本身应该是非原子的吗?

3 个答案:

答案 0 :(得分:1)

atomic使得设置和获取属性是原子的,如果属性不需要原子访问,也许只有在设置之后才从多个线程读取,那么它不需要是原子的。 或者,调用此属性的频率,您需要经常在循环中调用它以注意属性的原子效果。你也可以做一些事情,比如在一个方法中只调用一次属性,并保留一个局部引用,以减少它是原子的开销。

对于属性,如果有任何疑问我是否需要原子,我通常会将它们设为原子,如果这会产生性能问题,我可以考虑稍后再处理,但是由于引入了错误一个非原子的财产,是一个更严重的问题。

答案 1 :(得分:0)

想一想。如果你有一个返回NSLock的属性,是否会调用setter ?或者这会是一个可怕的错误,会让你的应用程序崩溃到处?

你应该做的是看看@synchronized并弄清楚它是否可能不是很多,比NSLock更容易使用。

答案 2 :(得分:0)

我应该将NSLock声明为原子,或者它只是浪费时间而且锁本身应该是非原子的吗?

默认情况下,Objective-C中的所有属性都是原子的。所以不需要将NSLock声明为原子。并且它还取决于您的要求是否要声明为非原子,基本上非原子属性用于多线程目的。如果你在声明时设置了非原子属性,那么任何其他想要访问该对象的线程都可以访问它并给出多线程的结果。所以与原子相比它更快。参考这个difference between atomic vs Non atomic