同步锁
iOS中一般我们声明一个属性
@property (nonatomic, strong) NSArray *students
那么括号中的nonatomic, strong就是这一个属性的特性。
- nonatomic:非原子属性,即不使用同步锁,保证性能更好。
- atomic:原子属性:是指在并发编程中,如果某些操作具有整体性,系统无法获取到这些操作的中间步骤生成的临时结果,只能看见操作前和操作后的结果,那么该操作就是原子的。atomic表示在多线程操作中会通过加锁来保证这个属性在被操作的时候别的线程无法获取到它。在iOS中使用同步锁开销大,会带来性能问题,并且就算属性设置为atomic,也无法保证线程安全,需要更深层的锁定机制才可以,所以一般是nonatomic。
为什么说atomic并不能保证线程安全
- atomic原理:在属性的setter方法中加锁
- 1.当线程A给对象O赋值时,线程B也想要给对象O赋值,这个时候O被线程A锁住,所以B只能等待,这个时候是线程安全的;
- 2.getter方法不安全,当线程A给对象O赋值时,此时只执行到加锁的那一步,还没有赋值,线程B去读取对象O的值,因为setter和getter方法没有任何联系,当真正赋值的时候,线程B已经把旧值读取走了,本来想读取设置后的新值,所以不是线程安全;
- 3.当线程A给对象O赋值时,线程B在A之前把对象O释放release掉了,此时会产生崩溃,所以不是线程安全。