美文网首页OC面试相关
atomic的原理,为什么线程不安全,@synchronized

atomic的原理,为什么线程不安全,@synchronized

作者: howhyone | 来源:发表于2021-09-29 19:03 被阅读0次

一、定义
原子操作:不可分割的操作,在原子操作执行完毕之前,其不会被任何其它任务或事件中断。
二、原理
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

相关文章

网友评论

    本文标题:atomic的原理,为什么线程不安全,@synchronized

    本文链接:https://www.haomeiwen.com/subject/oogjnltx.html