用atomic一定是线程安全的吗?

来源:互联网 发布:mysql导入xls文件 编辑:程序博客网 时间:2024/06/11 05:36

- (void)setProp:(NSString *)newValue {
    [_prop lock];
    _prop = newValue;
    [_prop unlock];
}
按我理解:
1.此处的线程安全是就getter,setter而言的。比如对于@property(nonatomic,copy)NSString *str; 当调用self.str = @"HELLO,GUY";如果是多线程,在一个线程执行setter方法的时候,会涉及到字符串拷贝,另一个线程去读取,很可能读到一半的数据,也就是garbage数据。
2.另外的话,它也仅限于getter,setter时的线程安全。比如@property(atomic,strong)NSMutableArray *arr;如果一个线程循环读数据,一个线程循环写数据,肯定会产生内存问题。因为它和setter,getter没有关系。

其次,atomic在set方法里加了锁,防止了多线程一直去写这个property,造成难以预计的数值。但这也只是读写的锁定。跟线程安全其实还是差一些。看下面。

 @interface MONPerson : NSObject @property (copy) NSString * firstName; @property (copy) NSString * lastName; - (NSString *)fullName; @endThread A:p.firstName = @"Rob";Thread B:p.firstName = @"Robert";Thread A:label.string = p.firstName; // << uh, oh -- will be Robert

但是如果有个C也在写,D在读取,D会读到一些随机的值(ABC修改的值),这就不是线程安全的了。最好的方法是使用lock。

Thread A:[p lock]; // << wait for it… … … …// Thread B now cannot access pp.firstName = @"Rob";NSString fullName = p.fullName;[p unlock];// Thread B can now access plabel.string = fullName;Thread B:[p lock]; // << wait for it… … … …// Thread A now cannot access p…[p unlock];

atomic有个很大的问题是很慢,要比nonatomic慢20倍。
当然最后建议这种数值数值变化可以让服务器来做。

0 0