一、定义
原子操作:不可分割的操作,在原子操作执行完毕之前,其不会被任何其它任务或事件中断。
二、原理
atomic修饰的属性,get或set方法只能被一个线程操作,保证数据的完整性
atomic与nonatomic内部实现的区别只是atomic对象setter和getter方法会加一个锁,而nonatomic并没有
@property (nonatomic) NSObject *nonatomicObj;
@property (atomic) NSObject *atomicObj;
@synthesize atomicObj = _atomicObj;
- (void)setNonatomicObj:(NSObject *)nonatomicObj{
if (_nonatomicObj != nonatomicObj) {
[_nonatomicObj release];
_nonatomicObj = [nonatomicObj retain];
}
}
- (NSObject *)nonatomicObj{
return _nonatomicObj;
}
- (void)setAtomicObj:(NSObject *)atomicObj{
@synchronized(self) {
if (_atomicObj != atomicObj) {
[_atomicObj release];
_atomicObj = [atomicObj retain];
}
}
}
- (NSObject *)atomicObj{
@synchronized(self) {
return _atomicObj;
}
}
三、线程不安全
1、如果线程 A 调了 getter,与此同时线程 B 、线程 C 都调了 setter——那最后线程 A get 到的值,有3种可能:可能是 B、C set 之前原始的值,也可能是 B set 的值,也可能是 C set 的值。同时,最终这个属性的值,可能是 B set 的值,也有可能是 C set 的值。所以atomic可并不能保证对象的线程安全。
2、atomic仅作用于编译器生成的get和set,如果重写了set或get方法,atomic的原子性不起作用
synchronized介绍: https://www.jianshu.com/p/172811e6ecaf
网友评论