非原子属性nonatomic
和原子属性atomic
原子属性atomic
:就是为了保证这个属性的安全性(线程安全),就是针对于多线程的设计的,原子属性就是给setter加锁,getter不加锁
默认的是atomic
,为什么平时用非原子属性nonatomic
而不是原子属性atomic
:当我们用原子属性atomic
属性的时候,我们对这个属性的的(写操作加锁,读操作不加锁)相当于上了把锁(这把锁叫 自旋锁),保证同一时间就只有一个线程能够执行,保证数据安全,性能会差点。除非这个属性可能会被多线程访问
//原子属性 == YES 先把文件保存在一个临时的文件中,等全部写入之后,再改名
[data writeToFile:@"hank.mp4" atomically:YES];
- 自旋锁 和 互斥锁
共同点:都能保证线程安全
不同点:
互斥锁:如果线程被锁在外面,那么这个线程就会进入休眠的状态,等待锁打开,线程就会被唤醒进入就绪状态
自旋锁:如果线程被锁在外面,线程就会用死循环的方法一直等待锁打开,并不是休眠(自旋锁更适合非常短的代码)
无论什么锁,都很消耗性能,效率不高
在单写多读的一种多线程技术,同样可能出现脏数据
线程安全
在多个线程进行读写操作时,仍然保证数据正确!UI 线程,共同约定:所有更新UI 的操作都放在主线程上执行!因为都在主线程中操作就不会出现资源抢夺的问题,规避了ui不安全的问题
原因:UIKit框架所有的类都是线程不安全的!!(因为线程安全效率下降!),
一般开发建议
- 所有的属性都声明为
nonatomic
- 应尽量避免多线程抢夺同一块资源
- 尽量将加锁,资源抢夺的业务逻辑交给服务器端去处理