使用atomic一定是线程安全的吗?
2016-06-01 22:00
387 查看
这个问题很少遇到,但是答案当然不是。
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倍。
当然最后建议这种数值数值变化可以让服务器来做。
原文链接:http://www.jianshu.com/p/c40b312153c1
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
相关文章推荐
- codevs 2612 最有分解方案 (贪心)
- __block 与 __weak的区别理解
- 汇率转换(java界面设计程序)
- HttpClient使用详解
- 剑指offer-27二叉搜索树与双向链表
- SQL语句语法
- 树莓派1代·添加一个linux系统调用·编译内核
- STM32F0xx_TIM输入捕获(计算频率)配置详细过程
- 第7次c++实验
- UITableView的分割线长短的控制
- HttpURLConnection用法详解
- 共同学习SpringMVC源码--DispatcherServlet(二)
- HashTable vs HashMap
- Java中运用数组的四种排序方法
- HttpUtils 的post请求
- 网络知识
- Android 显示gif动画
- 深度学习第三次课-梯度下降与反向传播
- HttpUtils解析XMl
- ios::ate和ios::app在C++文件中的区别