在iOS开发中,我们常常会用到@property来声明属性,在声明属性的关键字中有一对atomic和nonatomic关键字。
@property (nonatomic, copy) NSString *userName;
@property (atomic, copy) NSString *name;
其中atomic表示该属性的内存操作是原子性的,nonatomic表示该属性的内存操作是非原子性的。atomic要比nonatomic慢大约20倍。
可以简单的认为其实现是类似这样的:
#import <libkern/OSAtomic.h> //引入自旋锁的头文件
@synthesize name = _name;
OSSpinLock oslock = OS_SPINLOCK_INIT;
- (NSString *)name {
OSSpinLockLock(&oslock);
return _name;
OSSpinLockUnlock(&oslock);
}
- (void)setName:(NSString *)name {
OSSpinLockLock(&oslock);
if(name != _name) {
[_name release];
_name = [name copy];
}
OSSpinLockUnlock(&oslock);
}
不能
线程安全是指多个线程在并发执行时同时访问操作同一块内存造成数据错误或冲突,引起执行结果的不确定。
使用了atomic后只是保证了在使用这个属性的getter和setter时的线程安全,并不能保证整个对象是线程安全的。比如一个线程循环的读数据,另一个线程循环的写数据,必然会有线程安全的问题;如果一个线程正在getter或者setter,又有另一个线程同时进行了release操作,则会发生crash
总结
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。