原子性atomic/nonatomic
Posted jiuyi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了原子性atomic/nonatomic相关的知识,希望对你有一定的参考价值。
原子性:并发编程中确保其操作具备整体性,系统其它部分无法观察到中间步骤,只能看到操作前后的结果。
决定编译器生成的getter和setter是否原子(natomic)
操作。
因此,
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的主要内容,如果未能解决你的问题,请参考以下文章