码迷,mamicode.com
首页 > 其他好文 > 详细

原子性atomic/nonatomic

时间:2019-09-19 19:20:01      阅读:79      评论:0      收藏:0      [点我收藏+]

标签:技术   lob   name   pat   shu   syn   bsp   contain   global   

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

决定编译器生成的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;
    });
}

原子性atomic/nonatomic

标签:技术   lob   name   pat   shu   syn   bsp   contain   global   

原文地址:https://www.cnblogs.com/jiuyi/p/11551725.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!