美文网首页最牛iOS笔记
atomic与线程安全

atomic与线程安全

作者: 一个半吊子工程师 | 来源:发表于2020-09-08 10:04 被阅读0次

本篇文章采用的源码是objc4-781版本

使用atomic一定是线程安全的吗?

atomic不是绝对的线程安全。atomic的本意是指属性的存取方法是线程安全的,并不保证整个对象是线程安全的。

什么是线程不安全?

线程的不安全是由于多线程访问和修改共享资源而引起的不可预测的结果(有可能crash)。可以简单理解为我们拿到的值是错的。

首先了解atomic的原子性和nonatomic的非原子性

atomic :系统自动生成的getter/setter方法会进行加锁操作;可以理解过读写锁,可以保证读写安全;较耗时。
nonatomic:系统自动生成的getter/setter方法不会进行加锁操作;但速度会更快

源代码分析atomic为什么不是线程安全

atomic只是对属性的getter/setter方法进行了加锁操作,这种安全仅仅是get/set的读写安全,仅此而已,但是线程安全还有除了读写的其他操作,比如:当一个线程正在get/set时,另一个线程同时进行release操作,可能会直接crash。

runtimepropertyatomic是一个BOOL值,是采用spinlock_t锁去实现的;

atomic getter
atomic setter

你会发现atomic属性的setter/getter方法都被加了spinlock自旋锁。但是,需要注意的是spinlock已经由于存在优先级反转问题被弃用并用os_unfair_lock替代。既然被弃用了,这里为什么还在用;原因是进入spinlock_t去看会发现,底层已经被os_unfair_lick替换:


spinlock_t

光讲代码不易懂,来个例子

如果定义属性NSInteger i是原子的,对i进行i = i + 1操作就是不安全的; 因为原子性只能保证读写安全,而该表达式需要三步操作:
1、读取i的值存入寄存器;
2、将i加1;
3、修改i的值;
如果在第一步完成的时候,i被其他线程修改了,那么表达式执行的结果就与预期的不一样,也就是不安全的。

例 2

上图中我认为slice1,slice2打印应该是1到100
实际上

相关文章

  • iOS 中atomic与nonatomic区别,以及atomic

    atomic 与 nonatomic 区别 nonatomic:非原子属性,线程不安全的,效率高atomic:原子...

  • nonatomic和atomic的区别

    nonatomic:非线程安全 atomic:线程安全 atomic对属性的set 和get方法进行加锁,保证当前...

  • 问题:使用atomic一定是线程安全的吗?

    atomic不是绝对的线程安全。atomic的本意是指属性的存取方法是线程安全的,并不保证整个对象是线程安全的。 ...

  • 面试与问题记录 3

    一 .nonatomic 与atomic 区别,atomic是绝对线程安全吗 ?常用的锁有那些? 答: nonat...

  • atomic与线程安全

    iOS开发中,property用atomic修饰并不是真正的线程安全 创建 @property(atomic, a...

  • atomic与线程安全

    本篇文章采用的源码是objc4-781版本 使用atomic一定是线程安全的吗? atomic不是绝对的线程安全。...

  • atomic与线程安全

    atomic在日常开发中是个很少使用,也是个很容易出现错误的知识点,那么atomic能够保证线程安全吗? 答案是不...

  • iOS中属性关键词

    1.原子性与非原子性 atomic:原子性,只有一个线程可以同时访问实例。atomic 是线程安全的(因为会为se...

  • 题库整理(一)

    1.atomic和nonatomic的区别?atomic一定是线程安全的吗?atomic如何实现atomic? a...

  • iOS中的“锁事”

    抛砖引玉 说到锁不得不提线程安全,说到线程安全,作为iOS程序员又不得不提 nonatomic 与 atomic ...

网友评论

    本文标题:atomic与线程安全

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