序
记得以前面试的时候,有面试官问到atomic安全不安全,今天突然想起了这个问题,再总结记录一下。
结论
atomic是线程不安全的。
atomic只是保证了getter和setter存取方法的线程安全,但并不能保证这个属性所对应的成员变量是线程安全的。
解释
意思就是: 如果多个线程调用了getter或者setter,那么这些getter和setter的调用时线性的, 保证了同一时间只有一个函数(setter和getter)在调用, 但是并不能避免这个属性所对应的成员变量是线程安全的。
例如:
@property (atomic) NSString * name;
系统自动生成的getter:
-(NSString *)name;
Setter:
-(void)setName:(NSString *)name;
假设name所对应的成员变量是_name
。
atomic保证的是,setter和getter是线程安全的。
如,线程1调用getter了,线程2调用了setter,线程3调用了setter,那么atomic保证了一个线程的调用顺序:getter->setter->setter.
但是atomic并不能保证成员变量_name的线程安全。例如上面的例子中, 如果有个线程4直接release了_name, 那么在线程1、线程2或者线程3的调用过程中, 直接造成崩溃。