关于原子属性,Apple 的文档如下:
This means that the synthesized accessors ensure that a value is always fully retrieved by the getter method or fully set via the setter method, even if the accessors are called simultaneously from different threads.
“完全检索”或“完全设置”是什么意思? 为什么“完全检索”或“完全设置”不足以保证线程安全?
注意:我知道 SO 上有很多关于原子性的帖子,请不要将其标记为重复,除非票证专门解决了上述问题。看完帖子,我还是没有完全理解原子属性。
最佳答案
原子意味着对 getter/setter 的调用是同步的。这样一来,如果一个线程在设置属性的同时另一个线程正在获取它,那么获取该属性的线程将保证获得有效的返回值。如果不是原子的,则 getter 可能会检索垃圾值或指向立即释放的对象的指针。当它是原子的时,它还将确保如果两个线程同时尝试设置它,一个将等待另一个完成。如果它不是原子的,并且两个线程试图同时设置它,您最终可能会写入垃圾值,或者对象可能被过度保留/不足或过度释放/释放不足。
所以基本上,如果正在设置该属性,任何其他设置它或获取它的调用都将等待该方法返回。同样,如果正在获取该属性,任何其他获取或设置它的调用都将等到该获取完成。
这有时足以保证线程安全,具体取决于它的用途。但是为了线程安全,您通常需要不止于此级别的同步。例如,如果一个线程上的一个代码块获取了该值,对其进行了一些更改,并希望在没有其他线程同时更改它的情况下再次设置它。您将不得不进行额外的同步以确保从获取它之前到随后设置它之后都锁定它。如果您想获取一个对象并对该对象进行一些更改,而无需另一个线程同时尝试对其进行更改,您可能会想要执行相同的操作。
关于Objective-C:完全检索原子属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21707705/