zoukankan      html  css  js  c++  java
  • 原子性atomic/nonatomic

    原子性:并发编程中确保其操作具备整体性,系统其它部分无法观察到中间步骤,只能看到操作前后的结果。

    决定编译器生成的getter和setter是否原子(natomic)操作。

     
    i

    因此,
    atomic 效率较低,因为要保证操作完整,线程相对安全;
    nonatomic 不加同步,多线程并发访问效率高,但线程不安全。

    由于锁定机制开销较大,一般 iOS 开发中会使用 nonatomic。

    • atomic 也不是绝对的线程安全。当多个线程同时调用 setter 和 getter 时,就会导致获取的值不一样。

    兼顾线程安全和效率的方案

    要想线程绝对安全,就要使用 @synchronized同步锁。

    // 同步锁
    -(NSString *)name{
        @synchronized(self) {
            return _name;
        }    
    }
    
    -(void)setName:(NSString *)name{
        @synchronized(self) {
            _name = name;
        }
    }
    

    但是由于同步锁有等待操作,会降低代码效率。
    为了兼顾线程安全和提升效率,可采用 GCD 并发队列进行优化。getter 使用同步派发,setter 使用异步栅栏。

    // 并发队列
    _queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
    
    -(NSString *)name{
        __block NSString *localName;
        dispatch_sync(_queue, ^ {
            localName = _name;
        });
        return localName;
    }
    
    -(void)setName:(NSString *) name{
        dispatch_barrier_async(_queue, ^{
            _name = name;
        });
    }
  • 相关阅读:
    [SDOI2011]消防
    10.15 上午 考试
    松鼠搬家 ( 切比雪夫距离 到 曼哈顿距离 )
    10.14 上午 考试
    10.13 下午
    bzoj2640 元素 线性基+贪心
    猪国杀 大模拟
    10.13 上午 考试
    10.12 两次考试
    阿狸和桃子的游戏
  • 原文地址:https://www.cnblogs.com/jiuyi/p/11551725.html
Copyright © 2011-2022 走看看