答案 0 :(得分:0)
正如在发布的问题的几个答案中提到的,原子是线程安全的。这意味着在任何其他线程可以执行getter / setter之前,任何线程上的getter / setter都应该先完成。
答案 1 :(得分:0)
答案 2 :(得分:0)
操作不安全是由于操作可以分为几个子操作,例如:
a = a + 1
可以细分为操作
load value of a
add 1 to the loaded value
assign the calculated value to a.
单词" Atomic"来自" atom"来自希腊" atomos",这意味着"那些不能分裂的#34;。对于一个操作,它意味着它总是作为一个整体执行,它从不执行一次一个子操作。这就是为什么它是线程安全的。
TL; DR Atomic =线程安全。
大警告:拥有属性原子并不意味着整个函数/类是线程安全的。原子属性仅表示具有给定属性的操作是线程安全的。
答案 3 :(得分:0)
很显然,nonatomic
当然不是线程安全的。更有趣的是,atomic
更接近,但也不足以实现“线程安全性”。引用苹果公司的Programming with Objective-C: Encapsulating Data:
注意:属性原子性不是对象线程安全的同义词。
接着提供一个示例:
考虑一个
XYZPerson
对象,其中使用一个线程中的原子访问器来更改一个人的名字和姓氏。如果另一个线程同时访问两个名称,则原子获取方法将返回完整的字符串(不会崩溃),但不能保证这些值相对于彼此都是正确的名称。如果在更改之前访问了名字,但在更改之后访问了姓氏,那么您将得到一对不一致且不匹配的名称。这个例子非常简单,但是当跨相关对象网络考虑时,线程安全性的问题变得更加复杂。 Concurrency Programming Guide中详细介绍了线程安全性。
另请参阅bbum的Objective-C: Atomic, properties, threading and/or custom setter/getter。
之所以如此令人困惑,是因为实际上atomic
关键字确实确保您对该立即引用的访问是线程安全的。不幸的是,在处理对象时,这还远远不够。首先,您无法保证该属性本身的内部属性是线程安全的。其次,它不会同步您的应用对对象的各个属性的访问(例如上面的Apple示例)。因此,atomic
几乎总是不足以实现线程安全,因此通常必须采用更高级别的同步。而且,如果您提供更高级别的同步,则向该混合中添加原子性是多余且效率低下的。
因此,对于对象,atomic
几乎没有任何实用程序。但是,在处理原始C数据类型(例如整数,布尔值,浮点数)时,它可能会很有用。例如,您可能在其他某个线程中更新了一些布尔值,表明该线程的异步任务是否已完成。这是atomic
的完美用例。
否则,我们通常会寻求用于线程安全的更高级别的同步机制,例如GCD串行队列或读取器-写入器模式(...,或者,如今不那么流行,锁,@synchronized
指令等)。 )。