iOS开发常问问题:讲一下atomic的实现机制;为什么不能保证绝对的线程安全?

A: atomic的实现机制

  • atomicproperty的修饰词之一,表示是原子性的,使用方式为@property(atomic)int age;此时编译器会自动生成 getter/setter 方法,最终会调用objc_getPropertyobjc_setProperty方法来进行存取属性。

  • 若此时属性用atomic修饰的话,在这两个方法内部使用os_unfair_lock来进行加锁,来保证读写的原子性。锁都在PropertyLocks 中保存着(在iOS平台会初始化8个,mac平台64个),在用之前,会把锁都初始化好,在需要用到时,用对象的地址加上成员变量的偏移量为key,去PropertyLocks中去取。因此存取时用的是同一个锁,所以atomic能保证属性的存取时是线程安全的。

  • 注:由于锁是有限的,不用对象,不同属性的读取用的也可能是同一个锁

B: atomic为什么不能保证绝对的线程安全?

  • atomicgetter/setter方法中加锁,仅保证了存取时的线程安全,假设我们的属性是@property(atomic)NSMutableArray *array;可变的容器时,无法保证对容器的修改是线程安全的.

  • 在编译器自动生产的getter/setter方法,最终会调用objc_getPropertyobjc_setProperty方法存取属性,在此方法内部保证了读写时的线程安全的,当我们重写getter/setter方法时,就只能依靠自己在getter/setter中保证线程安全;


阅读更多:

  • iOS开发常问·问题合集 ·

你可能感兴趣的:(iOS开发常问问题:讲一下atomic的实现机制;为什么不能保证绝对的线程安全?)