atomic是不是线程安全的?

2019-06-26  本文已影响0人  成都老刘

记得以前面试的时候,有面试官问到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的调用过程中, 直接造成崩溃。

上一篇 下一篇

猜你喜欢

热点阅读