我什么时候不能使用原子属性?
我什么时候不能使用原子属性?
这个问题已经有答案了:
我知道有关原子和非原子属性的回答,但它们大多数似乎相当老旧(2011年及以前),因此我希望得到更新的建议。我的理解是,非原子属性快但不是线程安全的。这是否意味着任何可能同时从多个线程访问的属性都应该始终为原子属性?是否存在条件可以使其成为非原子属性?在确定将属性设置为原子属性还是非原子属性时,还有哪些考虑因素?
admin 更改状态以发布 2023年5月19日
将一个属性声明为原子并不一定使它线程安全。\n\n原子是默认的,并且与非原子相比,涉及一些额外的开销。如果线程A正在getter访问该属性的过程中,而线程B在setter中更改该值,则使用原子将确保getter返回一个可行的完整值。如果您使用非原子,则不会做出这样的保证,额外的代码不会生成,因此非原子更快。\n\n但是,这并不保证线程安全。如果线程A调用getter并且线程B和C正在使用不同的值更新线程,则线程A可能会获取任一值,并且没有保证它将获得哪个值。\n\n具体回答您的问题,很多情况下允许使用非原子属性,如果不是大多数情况。尽管使用原子的额外开销可能是可以忽略不计的。简单地说,您的属性是否在不同的线程上读取或设置?如果没有,您很可能不需要将它们声明为原子,但额外的开销可能甚至无法注意到。只是简单地将它们声明为原子并不保证线程安全。