美文网首页
iOS atomic noatomic

iOS atomic noatomic

作者: 孙掌门 | 来源:发表于2020-02-21 18:23 被阅读0次

iOS atomic noatomic

atomic:可以保证属性的 setter 和 getter 都是原子性操作,也就是保证 setter 和 gatter 内部都是线程同步的

我们看下源码

if (!atomic) {
        oldValue = *slot;
        *slot = newValue;
    } else {
        spinlock_t& slotlock = PropertyLocks[slot];
        slotlock.lock();
        oldValue = *slot;
        *slot = newValue;        
        slotlock.unlock();
    }

从代码上面可以看出,我们在设置值得时候,就会判断是否为 atomic ,如果为 atomic 的时候,系统会为我们加上自旋锁。

所谓的原子性操作,就是可以理解为不可分割,把一段代码看成一个整体,必须同时执行完才算一个整体,如下

    // 加锁
    int a = 1;
    int b = 2;
    int c = a + b;
    // 解锁

有可加锁解锁之后,上面的代码就是原子的了,在进行多线程访问的时候就不会出错。

atomic 并不能保证在使用属性的时候保证安全,只能保证set和get是安全的

如:


// 如果设置为 atomic,则下面是安全的,因为调用了 set 方法。
    self.arr = [NSMutableArray array];
    
    // 下面不是,self.arr 是get方法是安全的,但是 add 方法不是
    [self.arr addObject:@"1"];
    
    [self.arr addObject:@"2"];
    
    [self.arr addObject:@"3"];


addObject 方法不是线程安全的,只是 set 和 get 方法是安全的。

耗性能

我们属性的 set 和 get 方法调用的频率实在是太频繁了,所以不断的加锁解锁,会比较耗性能,不建议使用,mac上面倒也还好。

相关文章

  • iOS atomic noatomic

    iOS atomic noatomic atomic:可以保证属性的 setter 和 getter 都是原子性操...

  • atomic和noatomic原理分析

    atomic和noatomic的区别是什么?刚刚学iOS的时候是这样认识的:atomic是线程安全的,但它运行效率...

  • iOS - 基础

    iOS 属性修饰关键字都有哪些? atomic 原子性访问,对属性赋值的时候加锁 noatomic 非原子...

  • atomic和noatomic

    atomic 用于保证属性的getter setter方法的原子属性操作,相当于在getter和setter内部增...

  • atomic 和noatomic

    nonatomic:非原子的,非线程安全的,适合内存小的移动设备atomic:原子的,线程安全的 不写的话默认就是...

  • iOS中的内存管理

    一.读写安全 1.atomic与noatomic 2.pthead_rwlock 3.dispatch_barri...

  • 多线程--互斥锁和自旋锁

    自旋锁(atomic 原子锁) OC在定义属性时,经常会提到noatomic和atomic的两种选择.相信大家都知...

  • 2019年iOS面试题《一》

    讲讲你对noatomic & nonatomic的理解: atomic与nonatomic内部实现的区别只是ato...

  • iOS atomic 和nonatomic

    atomic:为setter方法加锁,原子属性。线程安全,消耗大量的资源。 noatomic:非原子属性,不会为s...

  • atomic是否线程安全?

    在申明属性的时候默认的是atomic原子性,在使用属性时我们会手动设置noatomic表示非原子性,这样做以提高访...

网友评论

      本文标题:iOS atomic noatomic

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