iOS开发常问问题:讲一下atomic的实现机制;为什么不能保证
2022-01-14 本文已影响0人
iOS打工犭袁
A: atomic的实现机制
-
atomic是property的修饰词之一,表示是原子性的,使用方式为@property(atomic)int age;此时编译器会自动生成getter/setter方法,最终会调用objc_getProperty和objc_setProperty方法来进行存取属性。 -
若此时属性用
atomic修饰的话,在这两个方法内部使用os_unfair_lock来进行加锁,来保证读写的原子性。锁都在PropertyLocks中保存着(在iOS平台会初始化8个,mac平台64个),在用之前,会把锁都初始化好,在需要用到时,用对象的地址加上成员变量的偏移量为key,去PropertyLocks中去取。因此存取时用的是同一个锁,所以atomic能保证属性的存取时是线程安全的。 -
注:由于锁是有限的,不用对象,不同属性的读取用的也可能是同一个锁
B: atomic为什么不能保证绝对的线程安全?
-
atomic在getter/setter方法中加锁,仅保证了存取时的线程安全,假设我们的属性是@property(atomic)NSMutableArray *array;可变的容器时,无法保证对容器的修改是线程安全的. -
在编译器自动生产的
getter/setter方法,最终会调用objc_getProperty和objc_setProperty方法存取属性,在此方法内部保证了读写时的线程安全的,当我们重写getter/setter方法时,就只能依靠自己在getter/setter中保证线程安全;