小码哥iOS学习笔记第二十三天: atomic

812 阅读1分钟
  • atomic用于保证属性settergetter的原子性操作,相当于在gettersetter内部加了线程同步的锁
  • 可以参考源码objc4objc-accessors.mm
  • 它并不能保证使用属性的过程是线程安全的

一、原子锁是什么意思

  • 现在有下面三句代码
int a = 10;             // 1
int b = 20;             // 2
int c = a + b;          // 3
  • 这三句代码, 如果被多线程访问, 那么就有可能有三条线程分别同时访问这三句代码
  • 原子锁的意思就是, 将这三句代码在同一时间只能有一条线程可以访问
// 加锁
int a = 10;             // 1
int b = 20;             // 2
int c = a + b;          // 3
// 解锁

二、查看atomic修饰的属性底层代码

  • 下面的代码就是给属性赋值的底层实现, 全都调用了reallySetProperty函数

  • 进入reallySetProperty函数, 可以看到赋值的前后, 如果是atomic修饰, 那么就会加上原子锁

  • 查看getter的底层实现, 可以看到取值的前后, 如果是atomic修饰, 那么就会加上原子锁

  • 原子锁只能保证settergetter内部的区域是安全的, 但是外部使用的时候就没办法保证

三、查看原子锁的底层结构