[OC]之 atomic 与 nonatomic的区别

一般iOS程序中,所有属性都声明为nonatomic,默认的是atomic的。这样做的原因是:
在iOS中使用同步锁的开销比较大, 这会带来性能问题。一般情况下并不要求属性必须是“原子的”,因为这并不能保证“线程安全”(thread safety),若要实现“线程安全”的操作,还需采用更为深层的锁定机制才醒。

atomic 系统会在生成的setter/getter方法里添加锁,但是这个锁仅仅是保证了setter/getter存取的安全。

 

atomic更准确的说应该是读写安全,但并不是线程安全的,因为别的线程还能进行读写之外的其他操作。线程安全需要开发者自己来保证,比如A、B线程读写,C线程release,以及其他不通过setter/getter操作该属性。

 

atomic属性内部的锁称为自旋锁
自旋锁表示如果共享数据已经有其他线程加锁了,线程会以do while死循环的方式等待锁,一旦被访问的资源被解锁,则等待资源的线程会立即执行。

自旋锁现在苹果已经不建议使用了,详细见YY作者的文章

https://blog.ibireme.com/2016/01/16/spinlock_is_unsafe_in_ios/?utm_source=tuicool

 

 

 

你可能感兴趣的:(开发知识总结)