Objective-C中的primefaces属性与线程安全性

在我读过的大多数讨论中,它表明使属性primefaces化并不能保证它是线程安全的,它只是保证返回的值不会是一个对象写入它而另一个对象的垃圾。试图同时阅读它。

我理解这不是线程安全的,因为第三个对象可能正在编写它,而访问它的对象不会被垃圾回收,它不完全确定它会在多个对象同时写入它时返回哪个值时间,它可能会得到他们的任何价值观。

因此,当我们说它不会返回垃圾时,垃圾是否意味着如果一个对象是非primefaces的并且一个对象试图访问它而另一个正在写入它,那么它可能会在写入中间得到结果,并且只能获得写入带来的部分不完整版本的变化? 这就是“垃圾”在这个意义上意味着什么,primefaces特性有助于预防?

Objective C中的atomic属性保证您永远不会看到部分写入。 当@property具有属性atomic ,不可能只部分写入该值。 二传手就是这样的:

 - (void)setProp:(NSString *)newValue { [_prop lock]; _prop = newValue; [_prop unlock]; } 

因此,如果两个线程想要同时写入值@“test”和@“otherTest”,则在任何给定时间该属性只能是属性的初始值或@“test”或@“otherTest”。 nonatomic速度更快,但该值是垃圾值,并且没有@“test”/ @“otherTest”(thx @Gavin)或任何其他垃圾值的部分字符串。

atomic只是线程安全,只需简单使用。 它没有被劫持。 Appledoc说如下:

考虑一个XYZPerson对象,其中使用来自一个线程的primefaces访问器来更改人的名字和姓氏。 如果另一个线程同时访问这两个名称,则primefacesgetter方法将返回完整的字符串(不会崩溃),但不能保证这些值将是相对于彼此的正确名称。 如果在更改之前访问了第一个名称,但在更改后访问了姓氏,则最终会出现一组不一致,不匹配的名称。

我根本没遇到使用primefaces的问题。 我设计了代码,primefaces属性没有问题。

回答你的第三段; 基本上是的。 线程正在写入数字时无法读取primefaces序数。

例如,如果一个线程写入了primefaces四字节数的前两个字节,并且在另一个线程上请求读取该数字,则该读取必须等到所有四个字节都被写入。

相反,如果一个线程写入了非primefaces四字节数的前两个字节,并且此时在另一个线程上请求读取该数字,它将读取前两个新数据字节,但将获得旧数据来自其他两个字节的先前写操作。

罗伯特哈维的答案是正确的,但有一个子案例需要考虑人们常常会错过。 请考虑以下代码: http : //pastebin.com/S7XyJm6G

除了阻止您读取部分写入的值之外,primefaces属性还会阻止您获取不能控制其生命周期的对象(它们通过保留然后自动释放对象来执行此操作)。 这在单线程代码中很重要,例如我链接的示例,但在multithreading代码中更为重要,其中另一个线程可能导致对象从您下面释放出来。

在并发编程中:

primefaces意味着如果在某个线程(线程#1)和其他线程(线程#2)中为写入操作访问的属性值尝试访问primefaces值以进行读取或写入操作,则其他线程(线程#2)等待直到线程#1完成了它的任务。 换句话说,primefaces以先到先得的方式同步财产的访问。

非primefaces意味着如果在某个线程(线程#1)和其他线程(线程#2)中为写入操作访问的属性值尝试访问非primefaces值以进行读取或写入操作,则其他线程(线程#2)获取价值立即获得旧价值

显式实现

@property(atomic,retain)NSNumber * count

会是这样的

 - (NSNumber *)count { NSNumber *count; @synchronized(self) { count = [_count retain]; // +1 } return [count autorelease]; // delayed -1 } - (void)setCount:(NSNumber *)count { id oldValue; @synchronized(self) { oldValue = _count; _count = [count retain]; } [oldValue release]; } 

Atomic是属性的默认行为。primefaces属性在获取或设置值时会增加一定程度的线程安全性。 也就是说,无论其他线程正在做什么,该属性的getter和setter将始终完全完成。 这些属性的访问速度比非primefaces相当慢。

明确地说我们会实施

@property(非primefaces,保留)NSNumber *计数

喜欢这个

 - (NSNumber *)count { return _count; } - (void)setCount:(NSNumber *)count { if (count != _count) { id oldValue = _count; _count = [count retain]; [_oldValue release]; } } 

非primefaces属性不是线程安全的,并将直接返回其属性。 这将比primefaces属性更快,但如果不采取预防措施,显然会带来一些风险。

这些非primefaces属性的setter&getter