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
中保证线程安全;
网友评论