原子性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;
});
}
原子性atomic/nonatomic的更多相关文章
- Objective-c的@property(atomic,nonatomic,readonly,readwrite,assign,retain,copy,getter,setter) 属性特性
assign:指定setter方法用简单的赋值,这是默认操作.你可以对标量类型(如int)使用这个属性.你可以想象一个float,它不是一个对象,所以它不能retain.copy. retain:指定 ...
- iOS开发多线程篇---atomic nonatomic区别
摘要 atomic和nonatomic区别用来决定编译器生成的getter和setter是否为原子操 作.atomic提供多线程安全,是描述该变量是否支持多线程的同步访问,如果选择了atomic 那么 ...
- ios atomic nonatomic区别
atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作. atomic 设置成员变量的@property属性时,默认为atomic,提供多线程安全 ...
- atomic nonatomic区别
摘要 atomic和nonatomic区别用来决定编译器生成的getter和setter是否为原子操作.atomic提供多线程安全,是描述该变量是否支持多线程的同步访问,如果选择了atomic 那么就 ...
- 对于atomic nonatomic assign retain copy strong weak的简单理解
atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作 1)atomic 设置成员变量的@property属性时,atomic是默认值,提供多线程安全 在多线程环 ...
- atomic,nonatomic
atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作. atomic 设置成员变量的@property属性时,默认为atomic,提供多线程安全 ...
- 并发与高并发(七)-线程安全性-原子性-atomic
一.线程安全性定义 定义:当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程 ...
- Objective-C RunTime 学习笔记 之 atomic/nonatomic 关键字
atomic修饰的是变量/方法,对于可变对象的指针变量是安全的,内部实现加了锁,但是对可变对象本身没什么影响,不安全还是不安全.另外atomic仅仅对编译器生产的getter.setter有效,如果自 ...
- Objective-C基础3
1.OC内存管理 1)范围:管理任何继承NSObject的对象,对其他的基本数据类型无效(堆区),否则会造成内存泄露 2)原理:任何对象都可能有用一个或多个所有者,只要一个对象至少还拥有一个所有者,它 ...
随机推荐
- [代码质量] 推荐一个vs自带工具分析代码的复杂度
转载自: https://blog.csdn.net/zh_geo/article/details/52954145 VS2012 -> Analyze -> Calculate code ...
- 用SC命令 添加或删除windows服务提示OpenSCManager 失败5
在安装命令行中安装 windowsOpenSCManager 失败5 的错误,原因是当前用户的权限不足,需要做的是在注册表 HKEY_LOCAL_MACHINE\Software\Microsof ...
- svg的viewport和viewbox
svg中视区重要的概念 1. viewport 视口,相当于显示器屏幕 2. viewbox 视区,相当于在屏幕上截取一小块,放大到整个屏幕,就是特写的效果 3. preserveAspectR ...
- [Bayes] MCMC (Markov Chain Monte Carlo)
不错的文章:LDA-math-MCMC 和 Gibbs Sampling 可作为精进MCMC抽样方法的学习材料. 简单概率分布的模拟 Box-Muller变换原理详解 本质上来说,计算机只能生产符合均 ...
- js 类型判断
- Redis哨兵(Sentinel)模式
Redis哨兵(Sentinel)模式 主从切换技术的方法是:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用.这不是一种推荐的方式 ...
- Python:self理解
Python类 class Student: # 类变量,可以通过类.类变量(Student.classroom)或者实例.类变量(a.classroom)方式调用 classroom = '火箭班' ...
- 使用transform后z-index失效的解决方法
transform作用的元素增加translateZ,父级元素增加 transform-style: preserve-3d; <div class="father"> ...
- IP通信学习心得01
一.物理拓扑 1. 1) 总线拓扑 特点:所有设备都处于同一个冲突域与广播域,共享相同的带宽 一次只能有一个设备传输,且两端要安装端接器. 传输介质:同轴电缆.(注:10Base5:容量10M 传输5 ...
- 下一代无服务器的发展形态: Serverless2.0
6 月 25 日,在上海召开的 KubeCon 2019 大会上,腾讯云重磅发布了下一代无服务器的发展形态:Serverless2.0.本文将以 Serverless 的概念.发展.形态.应用以及技术 ...
