美文网首页
atomic 和 nonatomic

atomic 和 nonatomic

作者: 懒懒的猫 | 来源:发表于2021-08-12 18:04 被阅读0次

在定义 property 的时候,大家不知道是否对这个有疑问?atomic 和 nonatomic 有何区别?

atomic 和 nonatomic 的区别在于,系统自动生成的 getter/setter 方法不一样。那到底有什么不一样呢,听我细细道来。

atomic

一些网上的文章会说atomic是原子性的操作,那到底什么是原子性的操作呢。意思就是不可分割的。就是说系统生成的 getter/setter 会保证 get、set 操作的完整性, atomic 会加一个锁来保障线程安全。不受其他线程影响。比如,线程 A 的 getter 方法运行到一半,线程 B 调用了 setter:那么线程 A 的 getter 还是能得到一个完好无损的对象。

但是这并不意味着线程安全,如果线程 A 调了 getter,与此同时线程 B 、线程 C 都调了 setter——那最后线程 A get 到的值,3种都有可能:可能是 B、C set 之前原始的值,也可能是 B set 的值,也可能是 C set 的值。同时,最终这个属性的值,可能是 B set 的值,也有可能是 C set 的值。这种操作需要在外层来使用多读单写的策略来保证线程安全。

nonatomic

nonatomic意为非原子性操作。是线程不安全的,nonatomic的速度要比atomic快。会节省一些开销。
但是如果你能在开发时保证同一时间只有一个线程来访问一个属性。那么就是可以的。

  • 举个例子

假设有一个 atomic 的属性 "name",如果线程 A 调[self setName:@"A"],线程 B 调[self setName:@"B"],线程 C 调[self name],那么所有这些不同线程上的操作都将依次顺序执行——也就是说,如果一个线程正在执行 getter/setter,其他线程就得等待。因此,属性 name 是读/写安全的。

但是,如果有另一个线程 D 同时在调[name release],那可能就会crash,因为 release 不受 getter/setter 操作的限制。也就是说,这个属性只能说是读/写安全的,但并不是线程安全的,因为别的线程还能进行读写之外的其他操作。线程安全需要开发者自己来保证。

如果 name 属性是 nonatomic 的,那么上面例子里的所有线程 A、B、C、D 都可以同时执行,可能导致无法预料的结果。如果是 atomic 的,那么 A、B、C 会串行,而 D 还是并行的。

总结一下:

  • Atomic
  1. 是默认的
  2. 会保证 CPU 能在别的线程来访问这个属性之前,先执行完当前流程
  3. 速度不快,因为要保证操作整体完成
  • Non-Atomic
  1. 不是默认的
  2. 更快
  3. 线程不安全
  4. 如有两个线程访问同一个属性,会出现无法预料的结果

相关文章

  • iOS atomic与nonatomic的区别以及各自功能

    一、atomic与nonatomic的区别! 首先,先介绍一下atomic和nonatomic 1.atomic使...

  • iOS 属性关键字(二)

    原子性 原子性就nonatomic和atomic两个关键字 atomic与nonatomic atomic是默认的...

  • iOS atomic & nonatomic的区别

    iOS atomic & nonatomic的区别 前言 atomic 和 nonatomic 用来决定编译器生成...

  • 关键字(@property属性)(I)

    nonatomic和atomic nonatomic:不使用同步锁,非原子性 atomic:使用同步锁,原子性 属...

  • nonatomic和atomic

    原子性(atomic):某操作具备整体性,也就是说,系统其他部分无法观察到其中间步骤所生成的临时结果,而只能看到操...

  • atomic 和 nonatomic

    解释就没必要的,网上、书上太多说明了,主要说说他们的区别,和一些容易理解错误的地方。 atomic并不是线程安全:...

  • nonatomic 和atomic

    两者的区别: 具备atomic特质会通过锁定机制来保持其操作的原子性,如果两个线程读写同一属性 那么无论何时,总能...

  • atomic和nonatomic

    atomic和nonatomic区别用来决定编译器生成的getter和setter是否为原子操作。atomic提供...

  • atomic和nonatomic

    常见场景 在定义 property 的时候,atomic和nonatomic有何区别? 答案:2,3行是一样的,不...

  • atomic和nonatomic

    一个类可能会有多个属性,而用来修饰属性的关键字有很多,我们也会经常遇到下面的面试题:atomic和nonatomi...

网友评论

      本文标题:atomic 和 nonatomic

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