美文网首页
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

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