码迷,mamicode.com
首页 > 编程语言 > 详细

使用atomic一定是线程安全的吗

时间:2016-03-06 00:57:57      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:

这个问题很少遇到,但是答案当然不是。
atomic在set方法里加了锁,防止了多线程一直去写这个property,造成难以预计的数值。但这也只是读写的锁定。跟线程安全其实还是差一些。看下面。

 @interface MONPerson : NSObject 
@property (copy) NSString * firstName; 
@property (copy) NSString * lastName; 
- (NSString *)fullName; 
@end

Thread A:
p.firstName = @"Rob";
Thread B:
p.firstName = @"Robert";
Thread A:
label.string = p.firstName; // << uh, oh -- will be Robert

但是如果有个C也在写,D在读取,D会读到一些随机的值(ABC修改的值),这就不是线程安全的了。最好的方法是使用lock。

Thread A:
[p lock]; // << wait for it… … … …
// Thread B now cannot access 
pp.firstName = @"Rob";
NSString fullName = p.fullName;
[p unlock];
// Thread B can now access plabel.string = fullName;

Thread B:
[p lock]; // << wait for it… … … …
// Thread A now cannot access p…
[p unlock];

atomic有个很大的问题是很慢,要比nonatomic慢20倍。
当然最后建议这种数值数值变化可以让服务器来做。

 

 

starain Dou 豆电雨

 

 

 

 

 

 

 

 

 

 

 

 

 

 

文/natewang(简书作者)
原文链接:http://www.jianshu.com/p/c40b312153c1
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

使用atomic一定是线程安全的吗

标签:

原文地址:http://www.cnblogs.com/starainDou/p/5246304.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!