在平时创建对象@property
的时候,我们会有用到atomic
跟nonatomic
,但两者的区别在哪里
atomic
使用atomic并不能保证绝对的线程安全,对于要绝对保证线程安全的操作,还需要使用更高级的方式来处理,比如NSSpinLock、@syncronized等
nonatomic
在不添加atomic
或nonatomic
的情况下,默认的是atomic
atomic
修饰的属性,系统生成的 getter/setter 会保证 get、set 操作的完整性,不受其他线程影响。比如,线程 A 的 getter 方法运行到一半,线程 B 调用了 setter:那么线程 A 的 getter 还是能得到一个完好无损的对象。
nonatomic
修饰的属性,不做保持getter完整性保证,但在运行速度上要比atomic快
快速理解
假设有一个 atomic 的属性 "name",如果线程 A 调[self setName:@"A"]
,线程 B 调[self setName:@"B"]
,线程 C 调[self name]
,那么所有这些不同线程上的操作都将依次顺序执行——也就是说,如果一个线程正在执行 getter/setter,其他线程就得等待。因此,属性 name 是读/写安全的。
但是,如果有另一个线程 D 同时在调[name release]
,那可能就会crash,因为 release 不受 getter/setter 操作的限制。也就是说,这个属性只能说是读/写安全的,但并不是线程安全的,因为别的线程还能进行读写之外的其他操作。线程安全需要开发者自己来保证。
如果 name 属性是 nonatomic 的,那么上面例子里的所有线程 A、B、C、D 都可以同时执行,可能导致无法预料的结果。如果是 atomic 的,那么 A、B、C 会串行,而 D 还是并行的。
简单来说,就是 atomic 会加一个锁来基本保障线程安全(但不能保证线程安全),并且引用计数会 +1,来向调用者保证这个对象会一直存在。假如不这样做,如有另一个线程调 setter,可能会出现线程竞态,导致引用计数降到0,原来那个对象就释放掉了。
本文向大家介绍http和https的区别与理解?相关面试题,主要包含被问及http和https的区别与理解?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: https的SSL加密是在传输层实现的。 (1)http和https的基本概念 http: 超文本传输协议,是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器
流处理和传统消息处理的基本区别是什么?正如人们所说,kafka是流处理的好选择,但本质上,kafka是一个类似于ActivMQ、RabbitMQ等的消息传递框架。 为什么我们通常不说ActiveMQ也适合流处理呢。 消费者消费消息的速度是否决定了它是否是流?
本文向大家介绍说说你对SVN和GIT的理解和区别相关面试题,主要包含被问及说说你对SVN和GIT的理解和区别时的应答技巧和注意事项,需要的朋友参考一下 职业早期使用过 SVN,记得在windows上面一个小乌龟的图标,不太聪明的亚子。。 svn是集中式的,允许单次下载单文件修改,因为对每个文件都有对应的.svn文件控制 git是分布式的,每次clone都是获得一个完整的代码版本,可以不依赖服务器本
本文向大家介绍& 和 && 的区别?相关面试题,主要包含被问及& 和 && 的区别?时的应答技巧和注意事项,需要的朋友参考一下 &运算符是:逻辑与;&&运算符是:短路与。 &和&&在程序中最终的运算结果是完全一致的,只不过&&存在短路现象,当&&运算符左边的表达式结果为false的时候,右边的表达式不执行,此时就发生了短路现象。如果是&运算符,那么不管左边的表达式是true还是false,右边表达
问题内容: 我所看到的一些问题和相关的错误和。访客中的任何人都可以解释域名的差异吗? 问题答案: 编码是指所使用的字符集。 排序规则确定排序顺序。 参见:http : //dev.mysql.com/doc/refman/5.5/en/charset- general.html
本文向大家介绍AdaBoost和GBDT的区别,AdaBoost和GBDT的区别?相关面试题,主要包含被问及AdaBoost和GBDT的区别,AdaBoost和GBDT的区别?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: AdaBoost通过调整错分的数据点的权重来改进模型,而GBDT是从负梯度的方向去拟合改进模型。 AdaBoost改变了训练数据的权值,即样本的概率分布,减少上一轮被正