用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
- 用atomic一定是线程安全的吗?
- Objective-C——atomic一定是线程安全的吗?
- nonatomic和atomic的区别?atomic是绝对的线程安全么?
- 无状态对象一定是线程安全的。
- JDK5中出现的Atomic...帮助实现线程安全
- 线程安全并且无阻塞的Atomic类
- log4j是线程安全的吗?
- servlet是线程安全的吗
- servlet默认是线程安全的吗
- Servlet是线程安全的吗?
- Android SQLite是线程安全的吗?
- springMVC是线程安全的吗?
- Connection实例是线程安全的吗
- Servlet是线程安全的吗?
- servlet是线程安全的吗?
- Android SQLite是线程安全的吗?
- servlet是线程安全的吗
- servlet是线程安全的吗?
- iOS每日一记——————一个很好的第三方库JVFloatLabeledTextField
- 如何用extjs 3.4做三层表头
- 17.1.4.4 Binary Log Options and Variables Binary Log
- 理解javascript面向对象编程
- 女生找对象与正则表达式(通配符)
- 用atomic一定是线程安全的吗?
- CEF C++环境搭建
- 浅谈android嵌入第三方sdk的二次封装原则
- C++ 接口(抽象类)
- Android Ant 自动打包带第三方库遇到的一些小问题
- MySQL日志
- Android_02_在内部或外部存储中读写文件的操作
- ArcGIS教程:多值提取至点 (空间分析)
- Linux性能测试工具