iOS 原子和非原子
atomic
- 是默认的(property上面如果没标注是nonatomic那么就是atomic,)
- 会保证 CPU 能在别的线程来访问这个属性之前,先执行完当前流程
- 速度不快,因为要保证操作整体性(在并发编程中,系统获取其他部分无法看到其中进行了哪些操作,他只能观察到操作前和操作后的结果)
non-Atomic
- 不是默认的
- 更快
- 线程不安全
- 如有两个线程同时访问同一个属性,会出现无法预料的结果
atomic和nonatomic的细节
原子:setter和getter方法加了同步锁,保证了在不同线程只能同时执行一个setter或getter方法,只能保证只有一个属性在读或在写。原子修饰保证了setter/getter的线程安全,但是并没有保证添加和删除操作的线程安全,比如你的属性在getter或setter的时候忽然有个线程删除了该属性,就会崩溃。如数组,我们需要更深层次的锁去保证其安全。
非原子:setter和getter方法不加锁,读取速度更快,比如两个地方同时读取一个属性,不会出现顺序问题,但是依然会出现安全问题,不能在多线程环境下工作。
题外话:iOS中不能承受过多同步锁的操作,会带来性能问题;而mac中则可以使用atomic,通常不会有性能问题,假如设置的属性只有get和set,没有增加删除,可以考虑使用atomic修饰
网友评论