美文网首页IOS码农的世界ios
iOS 为什么属性声明为atomic依然不能保证线程安全?

iOS 为什么属性声明为atomic依然不能保证线程安全?

作者: 齐舞647 | 来源:发表于2018-08-10 17:24 被阅读43次

一般我们在开发中,大部分属性的声明都会加上nonatomic,
以提高数据的读取效率。(即不使用同步锁)

那么为什么属性即使声明为atomic依然不能保证线程安全呢?

首先,先介绍一下nonatomic和atomic

  • nonatomic:不使用同步锁,非原子性
  • atomic:使用同步锁,原子性

属性声明为atomic时,
在该属性在调用getter和setter方法时,会加上同步锁,
即在属性在调用getter和setter方法时,保证同一时刻只能有一个线程调用属性的读/写方法。
保证了读和写的过程是可靠的。
但并不能保证数据一定是可靠的。

理由如下图:

相关文章

网友评论

  • Charlie_Z:保证了读和写的过程是可靠的,但并不能保证数据一定是可靠的。这点没错,但是你举的例子并不能证明这一点。
    齐舞647:@vvvei 多谢前辈指导!
    vvvei:@MrLiuQ atomic 的属性认识误区在于:让初学者误认为针对属性的任何操作会是线程安全的。
    其实只是保证了setter和getter是线程安全而已。
    如果举这个例子:
    @property(atomic,strong) NSArray *list;
    for (id x in list) {
    }
    用来说明这种枚举方法并不线程安全,就比较好理解了。
    齐舞647:想向您请教一下原因。

本文标题:iOS 为什么属性声明为atomic依然不能保证线程安全?

本文链接:https://www.haomeiwen.com/subject/werlbftx.html