我们在学习OC的时候认为,atomic使用了原子性,保证了线程安全,事实真的是这样吗?

nonatomic的内存管理语义是非原子性的,非原子性的操作本来就是线程不安全的,而atomic的操作是原子性的,但是并不意味着它是线程安全的,它会增加正确的几率,能够更好的避免线程的错误,但是它仍然是线程不安全的。

当使用nonatomic的时候,属性的setter,getter操作是非原子性的,所以当多个线程同时对某一属性读和写操作时,属性的最终结果是不能预测的。

当使用atomic时,虽然对属性的读和写是原子性的,但是仍然可能出现线程错误:当线程A进行写操作,这时其他线程的读或者写操作会因为该操作而等待。
当A线程的写操作结束后,B线程进行写操作,然后当A线程需要读操作时,却获得了在B线程中的值,这就破坏了线程安全,如果有线程C在A线程读操作前
release了该属性,那么还会导致程序崩溃。所以仅仅使用atomic并不会使得线程安全,我们还要为线程添加lock来确保线程的安全。

也就是要注意:atomic所说的线程安全只是保证了getter和setter存取方法的线程安全,并不能保证整个对象是线程安全的。如下列所示:

比如:@property(atomic,strong)NSMutableArray *arr;

如果一个线程循环的读数据,一个线程循环写数据,那么肯定会产生内存问题,因为这和setter、getter没有关系。如使用[self.arr objectAtIndex:index]就不是线程安全的。好的解决方案就是加锁。

据说,atomic要比nonatomic慢大约20倍。一般如果条件允许,我们可以让服务器来进行加锁操作。

最新文章

  1. 给VMware下的Linux扩展磁盘空间(以CentOS6.5为例)
  2. Requirements of an SAP system administrator
  3. Hadoop伪分布模式配置
  4. css简单了解
  5. Visual Studio 生成DLL文件
  6. Selenium2Lib库之操作浏览器相关的关键字实战
  7. 根据Webservice地址,动态传入参数(Webservice代理类)
  8. 数据仓库中的Inmon与Kimball架构
  9. zabbix 邮件报警配置
  10. vetur插件提示 [vue-language-server] Elements in iteration expect to have 'v-bind:key' directives错误的解决办法
  11. SpringMVC(二四) 视图解析流程
  12. Java:Linux上java -jar xxx.jar&java -cp 区别
  13. tablediff工具实用
  14. 【官方文档】Nginx负载均衡学习笔记(三) TCP和UDP负载平衡官方参考文档
  15. hdoj2111 Saving HDU
  16. EXT4.1表单提交(非AJAX)
  17. Markdown---锚点使用
  18. Spotlight 连接SuSE11 linux报错的解决方法
  19. [LeetCode] 9. Palindrome Number ☆
  20. 向html当中插入数据

热门文章

  1. CentOS 6中MATLAB print函数“所见非所得”bug的解决方案
  2. 前端工程师IE6兼容性问题随笔(未完待续)
  3. 过滤器Filter
  4. 发布自己的pods到CocoaPods trunk 及问题记录
  5. DataSet集合直接根据传入的类转List<T>集合
  6. i7 4790 z97-ar ssd 固态硬盘 装机的一些经历
  7. CDH5.4.5运行Phoenix导入CSV文件
  8. 第二篇.Bootstrap起步
  9. linux配置网卡绑定
  10. mac idea快捷键