atomic用于保证属性setter、getter的原子性操作,相当于在getter和setter内部加了线程同步的锁
- 可以参考源码
objc4的objc-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修饰, 那么就会加上原子锁
- 原子锁只能保证
setter和getter内部的区域是安全的, 但是外部使用的时候就没办法保证
三、查看原子锁的底层结构