美文网首页
iOS的atomic并不能保证绝对的线程安全

iOS的atomic并不能保证绝对的线程安全

作者: song91425 | 来源:发表于2021-08-25 22:03 被阅读0次

1、iOS的atomic修饰的属性的读写的单个操作确实原子性的,但是它却不是线程安全的。

假设这个场景,有一个线程多次访问这个属性,在这个线程访问的期间这个属性是有可能被其他线程修改值的,所以atomic不能保证线程安全。

2、如何保证对读写的线程安全?

2.1 GCD 的栅拦分发队列 dispatch_barrier_async/dispatch_barrier_async

栅拦分发只对并发队列有效,栅拦分发必须单独执行,也就是说,如果执行到栅拦分发队列,那么一定是需要等执行在栅拦块之前的所有分发队列实行完成,栅拦分发队列才会执行,如下图示意。需要等所有读取操作完成(浅蓝色),才会执行写入操作,这样就保证读取同步。


读操作并发执行,但是读和写操作串行

2.2 读操作并发执行,但是读和写操作串行的示例代码

同步和异步分发能够达到同步效果

dispatch_queue_global_t queue =  dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) // dispatch_get_global_queue是一个并行队列

-(NSString*) someString{
    __block NSString *newValue ;
    dispatch_sync(queue, ^{ // 同步队列
        newValue = someString;
    })
    return newValue;
}

-(void) setSomeString:(NSString *) someString{
    dispatch_barrier_async(queue, ^{ // 栅拦队列
        _someString = someString;
    })
}

3、同步队列块和异步队列块的执行时间

我们需要知道,异步队列比同步队列在底层执行的时候回多一个步骤,异步会把要执行的块copy到堆的过程(因为这个块延迟执行,如果在栈上就有可能会被系统回收),同步的块直接分在栈上,直接同步执行
所以异步分发队列的执行时间开销会比同步的开销大,如果异步分发队列执行的块逻辑要比copy的代价小,可以考虑直接使用同步队列。
所以可以把上面异步栅拦分发队列换成同步的执行

相关文章

  • 问题:使用atomic一定是线程安全的吗?

    atomic不是绝对的线程安全。atomic的本意是指属性的存取方法是线程安全的,并不保证整个对象是线程安全的。 ...

  • 开发iOS程序为什么使用nonatomic而不使用atomic?

    因为在iOS程序中使用同步锁开销较大,会带来性能问题,而且使用atomic(原子性)并不能真正的保证线程安全,若想...

  • 【OC梳理】atomic的安全性?

    之前的文章提到了,atomic保证了属性的原子性,但并不能保证线程的安全性,这种说法其实不是很准确。 atomic...

  • atomic 与 nonatomic

    参考文章 大致含义:1,nonatomic 线程不安全显而易见2,atomic原子操作,线程相对安全但是并不能保证...

  • atomic是绝对安全的么?

    atomic只能保证属性的存取是线程安全的,并不能保证整个对象是线程安全的。首先看一下代码以及打印结果: 错误的分...

  • nonatomic和atomic的区别

    nonatomic:非线程安全 atomic:线程安全 atomic对属性的set 和get方法进行加锁,保证当前...

  • 出一套:iOS中高级面试题

    iOS基础 1:讲讲你对atomic & nonatomic的理解 1、原子操作对线程安全并无任何安全保证。被 a...

  • 总结

    #### 讲一下atomic的实现机制;为什么不能保证绝对的线程安全(最好可以结合场景来说)? runtime...

  • 2020-09-16

    2020年iOS面试 记录一下自己遇到的面试题 百度: 1.atomic是不是线程安全的?怎么保证线程安全? 2....

  • atomic和nonatomic 的区别

    property 定义属性来修饰用的atomic,nonatomic atomic:保证线程安全的,速度不快,因为...

网友评论

      本文标题:iOS的atomic并不能保证绝对的线程安全

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