我什么时候不能使用原子属性?

27 浏览
0 Comments

我什么时候不能使用原子属性?

这个问题已经有答案了

原子属性和非原子属性有什么区别?

我知道有关原子和非原子属性的回答,但它们大多数似乎相当老旧(2011年及以前),因此我希望得到更新的建议。我的理解是,非原子属性快但不是线程安全的。这是否意味着任何可能同时从多个线程访问的属性都应该始终为原子属性?是否存在条件可以使其成为非原子属性?在确定将属性设置为原子属性还是非原子属性时,还有哪些考虑因素?

admin 更改状态以发布 2023年5月19日
0
0 Comments

将一个属性声明为原子并不一定使它线程安全。\n\n原子是默认的,并且与非原子相比,涉及一些额外的开销。如果线程A正在getter访问该属性的过程中,而线程B在setter中更改该值,则使用原子将确保getter返回一个可行的完整值。如果您使用非原子,则不会做出这样的保证,额外的代码不会生成,因此非原子更快。\n\n但是,这并不保证线程安全。如果线程A调用getter并且线程B和C正在使用不同的值更新线程,则线程A可能会获取任一值,并且没有保证它将获得哪个值。\n\n具体回答您的问题,很多情况下允许使用非原子属性,如果不是大多数情况。尽管使用原子的额外开销可能是可以忽略不计的。简单地说,您的属性是否在不同的线程上读取或设置?如果没有,您很可能不需要将它们声明为原子,但额外的开销可能甚至无法注意到。只是简单地将它们声明为原子并不保证线程安全。

0
0 Comments

声明一个属性为atomic会使编译器生成额外的代码,以防止并发访问该属性。这个额外的代码会锁定一个信号量,然后获取或设置属性,最后释放这个信号量。atomic属性的读取或设置相对于读取或设置原始值或指针来说,锁定和释放信号量的代价是昂贵的(尽管如果您考虑整个应用程序的流程,这通常是可以忽略的)。\n由于iOS下大多数的类,尤其是与UI相关的类,都将在单线程环境中使用,因此可以放弃atomic(即写nonatomic,因为属性默认是atomic),即使操作相对较为廉价,您也不希望为不需要的东西付费。

0