atomic

atomic是property的修饰词,原子属性,@property (atomic) int age;编译器会自动生成getter/setter,最终会调用objc_setproperty和objc_getProperty方法来进行存取。

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

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

问:atomic为什么不能保证绝对的线程安全?
atomic在getter/setter方法中加锁,仅保证了存取时的线程安全,假设属性是可变容器,无法保证对容器的修改是线程安全的。
编译器自动产生的getter/setter方法最终会调用objc_getProperty和objc_setproperty方法存取属性,在此内部保证了读写时的线程安全,当我们重写getter/setter方法时,就只能自己在getter/setter方法内保证线程安全了。

你可能感兴趣的:(atomic)