Is an atomic property thread safe?
关于原子性和非原子性,我已经回答了很多问题。但我无法理解原子属性是否是线程安全的?请举例说明。
- stackoverflow.com/questions/21098494/…在哪方面不够?
- @bbum哇,你可以标记为多个问题的副本:o
- @LUK2302:问题副本,答案总计几千个信誉点。
- 正如苹果所说,atomic意味着合成的访问器可以确保一个值总是由getter方法完全检索,或者通过setter方法完全设置,即使访问器是从不同线程同时调用的。"但是苹果继续澄清(举个例子)"属性原子性不是对象的同义词。"的线程安全。
- 你要回应所有的行动吗?
是的
一个/一个原子属性是线程安全的。原子性就是这个意思。
CAUTION
但是,两个原子属性对于彼此来说都不是线程安全的,原子属性线程的内容也不是线程安全的。(听起来有点困惑,但不得不说)
这意味着始终保证您能够从属性中读取完整的函数值,没有断开的指针,或者中介空值或其他任何值。
但不能保证原子属性中的值是线程安全的。这是一个完全不同的话题。
Making all properties of a class atomic will not at all make the class itself thread-safe.
- 不,原子不能确保属性是线程安全的。只有当属性是基本数据类型或不可变对象时,才会这样做。但对于许多对象,它不能保证线程安全(如果在需要进一步同步的情况下使用,atomic只会增加更多不必要的开销)。您的最终评论暗示了这一点,但我们不应让读者推断atomic确保线程安全。
- @Rob这正是我要说的:指针是线程安全的,但这与指针指向的对象无关。
- 同意。但是称之为"线程安全"有点误导,imho。太多的读者只是假设"哦,我将使用atomic",它将是线程安全的",这通常不是真的(或者至少没有任何意义)。它只在非常有限的情况下提供线程安全性。
- @Rob好的,我会澄清一下,我现在在手机上
- @Rob"太多的读者只是假设[…]"——那么他们不应该首先编写多线程代码。除了编写单线程应用程序之外,线程安全没有什么大不了的。
- @Tam&225;szahola-这是我的观点。正确答案是"atomic使我的代码线程安全吗?"不是强调的"是",而是更加谨慎的"不,它比这复杂得多"。给人留下这样的印象:atomic属性会导致线程安全代码,这对刚开始使用多线程编码的开发人员来说是一个极大的伤害。
- @如果问题是那样的话,我也会这么说的。但他问原子属性是否是线程安全的,这是真的。关键是两个或多个原子操作通常不会合并成一个原子复合操作。为了缓解这个问题,我们有软件事务性内存(en.wikipedia.org/wiki/…),但这是一个完全不同的故事…
属性访问器是线程安全的。基本上,原子性质相当于:
1 2 3 4 5 6 7 8 9 10 11
| - (id)atomicProperty {
@synchronized(self) {
return _atomicProperty;
}
}
- (void)setAtomicProperty:(id)atomicProperty {
@synchronized(self) {
_atomicProperty = atomicProperty;
}
} |
- 正如对另一个答案的评论中所讨论的,atomic或您的@synchronized格式副本只提供了一个非常小的线程安全概念,而且在实践中,通常需要更广泛的同步级别来实现真正的线程安全。在处理可变对象时,访问器级别的同步不足以实现线程安全。
- 确切地。线程安全方法调用的序列不是线程安全的。但是,属性getter和setter是线程安全的,因为底层的ivar是原子设置的(因此称为atomic)。
- 我不知道为什么我们会被否决,把我的否决权作为补偿;)