美文网首页iOS面试基础知识点
iOS开发常问问题:讲一下atomic的实现机制;为什么不能保证

iOS开发常问问题:讲一下atomic的实现机制;为什么不能保证

作者: iOS打工犭袁 | 来源:发表于2022-01-14 14:19 被阅读0次

    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开发常问问题:讲一下atomic的实现机制;为什么不能保证

        本文链接:https://www.haomeiwen.com/subject/qrmacrtx.html