什么时候使用@atomic?
我已经看过这个问题:
primefaces和非primefaces属性之间有什么区别?
我知道@atomic
不保证线程安全 ,我必须使用其他机制(例如@synchronized
)来实现这一点。 基于此,我还不知道何时使用@atomic
属性。 我想知道单独使用@atomic
USE CASE 。
atomic
属性的典型用例是在跨多个线程处理原始数据类型时。 例如,假设您有一些后台线程正在进行一些处理,并且您有一些BOOL
状态属性,例如isProcessComplete
,您的主线程想要检查后台进程是否完成:
if (self.isProcessComplete) { // Do something }
在这种情况下,将此属性声明为atomic
允许我们跨多个线程使用/更新此属性,而不需要任何更复杂的同步机制,因为:
- 我们正在处理一个标量的原始数据类型,例如
BOOL
; - 我们宣称它是
atomic
; 和 - 我们正在使用访问器方法(例如
self.
)而不是直接访问ivar。
在处理对象或其他更复杂的情况时, atomic
通常是不够的。 正如您所指出的那样,在实践中,单独使用atomic
很难实现线程安全,这就是我们不经常使用它的原因。 但对于简单的,独立的原始数据类型, atomic
可以是确保跨多个线程安全访问的简单方法。
@atomic
将向您保证,您将获得的价值不会是胡言乱语。 可能的情况是从一个线程读取给定值并从另一个线程设置其值。 然后@atomic
关键字将确保您收到整个值。 现在重要的是,您获得的值不能保证是最近设置的值。
关于用例的你的问题的第二部分纯粹是间接的,取决于意图的实现。 例如,如果您每隔一秒钟对列表进行某种基于时间的更新,您可以使用atomic来确保获得整个值,更新您的列表的计时器可以确保您将在屏幕上获得最新数据在一些隐含的逻辑中或在引擎盖下。
编辑:在@Rob发表评论后,我发现需要解释我答案的最后部分。 在大多数情况下, atomic
还不足以完成工作。 并且需要更好的解决方案,例如@synchronized
。