Objective c 将NSlock用作原子属性还是非原子属性?

Objective c 将NSlock用作原子属性还是非原子属性?,objective-c,nslock,Objective C,Nslock,我应该将NSLock声明为原子的,还是只是浪费时间,锁本身应该是非原子的 想想看。如果您有一个返回NSLock的属性,是否会调用setter?或者这是一个可怕的bug,会让你的应用程序到处崩溃吗 你应该看看@synchronized,看看它是否比NSLock更容易使用 我应该将NSLock声明为原子的,还是只是浪费时间,锁本身应该是非原子的? 默认情况下,Objective-C中的所有属性都是原子属性。因此无需将NSLock声明为原子。而且它还取决于您的需求,您是否想要声明为非原子的,基本上非原

我应该将NSLock声明为原子的,还是只是浪费时间,锁本身应该是非原子的

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


你应该看看@synchronized,看看它是否比NSLock更容易使用

我应该将NSLock声明为原子的,还是只是浪费时间,锁本身应该是非原子的?


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

原子使设置和获取属性原子化,如果不需要以原子方式访问属性,也许它只在设置为后读取多个线程,那么它就不需要是原子的。 或者,这个属性多久调用一次,您需要在循环中非常频繁地调用它,以注意该属性是原子的效果。您还可以在一个方法中只调用属性一次,并保留对它的本地引用,以减少它作为原子的开销


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

我不确定我是否理解这个答案。
@synchronized
不是使用
NSLock
对象实现的吗?请澄清。@synchronized是以编译器认为最好的方式实现的,可能类似于NSLock,也可能不是;不太可能是NSLock对象。但是为什么您要做编译器可以为您做的工作呢?我从这个问题中了解到,这个
NSLock
属性被设计为可以从对象外部访问,否则为什么它一开始就是一个属性呢。因此,
@synchronized
不会成为替代品。请澄清
NSLock
属性的用法。它是只在物体内部使用,还是被设计成“抛出去”给其他物体供自己使用?也不确定这是否回答了这个问题。问题是,问题还不清楚……使用原子解决多线程问题是非常罕见的,所以最好的情况是浪费时间,最坏的情况是它会让你错误地相信安全性。在这种情况下,更改NSLock对象必然会导致重大问题。我在回答中提到,不需要声明原子。默认情况下,所有属性都是原子的。这并不能回答问题<代码>原子与
属性
无关。
属性
恰好默认为
原子属性
并不是这个问题的答案。