atomic与nonatomic使用的误区

当讨论到property多线程安全的时候,很多人都知道给property加上atomic attribute之后,可以一定程度的保障多线程安全。

但是这个其实是存在误区的,设置atomic后,只是默认的生成getter和setter方法执行是原子的,只能保证多线程中执行getter和setter方法是线程安全的,但是实际上很多时候是执行getter后需要对变量做处理,这个时候就会出问题。

两个线程访问同一个atomic修饰的属性

上面这段代码就会出现闪退,因为self.atomicProperty.length是原子的,这个时候如果是@“1234567890”,进入到if中后,值可能会变为@“123”,导致闪退。

为了避免上面这种多线程访问和写入的问题,如果访问只是简单的访问时,可以用一个局部变量接收一下,或者通过代码块加锁的方式来避免,如下:

通过局部变量接收
通过加锁方式

不过由于atomic速度不快,所以如果不会多线程中操作的话,尽量还是使用nonatomic修饰。


另外之前看到有人问:系统默认的是atomic的,为什么大多时候都是使用nonatomic?

看到有个大神的解释是:理论上如果没有特殊要求的话,iOS用nonatomic比较好,而OSX用atomic比较好。如果不写的话,系统按照相对比较安全的atomic处理。iOS用nonatomic主要是出于性能考虑,OSX上性能不是瓶颈,所以就不用了。


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 兵哥哥说他们那里下雪了,北京什么时候下雪? 好想和兵哥哥一起看雪,在雪地里 走着、跑着、打闹着,就这样一起到白头…...
    刚刚焦阅读 228评论 0 0
  • 它好像是独立的,完全不属于任何人。是一双没有魂了的双手,还是它的魂也随着雨滴飘散到了什么地方。 没有任何的知觉...
    谁沧桑了我的人生阅读 247评论 0 0
  • 《2017年总结及2018年展望》 ...
    车柚派阅读 629评论 0 0
  • MySQL的时间类型timestamp提供了几种设置默认值的方式,合理利用后无需手动给他设置值,可以提高开发效率,...
    田文健阅读 5,650评论 0 0
  • 经常有简友问我这样的一个问题,“你的动图是如何制作的?用什么软件?”。因此,在日常写作中,亦或是在每个人都有可能遇...
    傲看今朝阅读 1,059评论 3 15