【问题标题】:Is an atomic property thread safe? [duplicate]原子属性线程安全吗? [复制]
【发布时间】:2015-11-15 18:20:32
【问题描述】:

我已经阅读了许多关于原子和非原子属性的答案。但我无法理解原子属性是否是线程安全的?请举例说明。

【问题讨论】:

  • @bbum wow,你可以标记为多个问题的重复:O
  • @luk2302:重复的问题,答案总计数千点。
  • As Apple says, atomic "表示合成访问器确保始终通过 getter 方法完全检索或通过 setter 方法完全设置值,即使访问器同时从不同的线程。”但苹果继续澄清(通过一个例子)“属性原子性不是对象的线程安全的同义词。”
  • OP你会全部回复吗?

标签: objective-c properties thread-safety atomic


【解决方案1】:

是的

an / one 原子属性是线程安全的。这就是原子性的含义。

注意

但是两个原子属性彼此之间都不是线程安全的,原子属性的内容也不是线程安全的。 (听起来有点混乱,但已经说过了)

这意味着您始终可以保证能够从属性中读取完整的功能值,没有损坏的指针,或者中间的 null 或其他任何东西。

但是您不能保证该原子属性中的值是线程安全的。那是一个完全不同的话题。

使类的所有属性都原子化根本不会使类本身成为线程安全的。

【讨论】:

  • 不,atomic 不能确保属性是线程安全的。只有当属性是基本数据类型或不可变对象时才会这样做。但是对于许多对象,它并不能保证线程安全(如果在需要进一步同步的情况下使用,atomic 只会增加更多不必要的开销)。您的最终评论暗示了这一点,但我们不应让读者推断atomic 确保线程安全。
  • @Rob 这正是我要说的:指针是线程安全的,但这与指针指向的对象无关。
  • 同意。但是,恕我直言,称其为“线程安全”有点误导。太多的读者只是假设“哦,我将使用atomic,它将是线程安全的”,这通常不是真的(或者至少在任何有意义的意义上都不是)。它只在非常有限的情况下提供线程安全。
  • @Rob 好的,稍后会澄清一下,我现在在手机上
  • @TamásZahola - 这就是我的观点。 “atomic 是否使我的代码线程安全?”的正确答案不是一个强调的“是”,而是一个更加谨慎的“不,它远比那复杂得多”。给人留下atomic 属性导致线程安全代码的印象对刚接触多线程编码的开发人员来说是一种极大的伤害。
【解决方案2】:

属性访问器是线程安全的。基本上原子属性等价于:

- (id)atomicProperty {
    @synchronized(self) {
        return _atomicProperty;
    }
}

- (void)setAtomicProperty:(id)atomicProperty {
    @synchronized(self) {
        _atomicProperty = atomicProperty;
    }
}

【讨论】:

  • 正如 cmets 中对另一个答案的讨论,atomic(或您的 @synchronized 演绎版)仅提供非常小的线程安全概念,并且在实践中通常提供更广泛的同步级别是实现真正的线程安全所必需的。在处理可变对象时,访问器级别的同步不足以实现线程安全。
  • 没错。一系列线程安全的方法调用是线程安全的。但尽管如此,属性 getter 和 setter 是线程安全的,因为底层 ivar 是原子设置的(因此命名为 atomic)。
  • 我不知道为什么我们被否决了,把我的赞成票作为补偿 ;)
猜你喜欢
  • 2021-11-07
  • 2014-02-01
  • 1970-01-01
  • 2010-10-11
  • 2020-09-15
  • 2019-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多