美文网首页
iOS同步异步和队列的通俗理解

iOS同步异步和队列的通俗理解

作者: 小雨hahaha | 来源:发表于2019-04-18 15:13 被阅读0次

    dispatch_sync先上两个概念:

    一、队列:(只是提供是否可以开启多线程的环境条件)

    1、串行队列
    2、并行队列
    3、主队列(每个应用对应唯一一个主队列)
    4、全局队列(系统的并行队列)

    二、任务:(真正决定要不要开启多线程)

    1、同步执行(不可开新线程)
    2、异步执行(可以开新线程)

    以售票厅售票排队的事情为例

    如果有一个三个窗口的售票厅,窗口相当于队列,同时开放相当于并行队列,也就是可以支持同时三个窗口售票,只开放一个窗口相当于串行队列

          1号窗口               2号窗口           3号窗口
        旅游团A(A1,A2,A3)
        旅游团B(B1,B2)
        旅游团C(C1,C2,C3)
    

    同步执行的时候,各个旅游团不可以分散排队,只能排到某一个窗口下进行依次买票,各个旅游团的人也要按照顺序进行买票,也就是A1--A2--A3---B1----B2----C1---C2---C3
    异步执行的时候,各个旅游团可以分散排队,但是旅游团内部仍需要按照顺序进行买,也就是可以旅游团A排1,旅游团B排3,旅游团C排2,三个窗口同时开启售票,此时,旅游团A的三个人肯定是一个线程,团B两个人是一个线程,旅游团C三个人是一个线程,所以打印出来的顺序可能是A1 B1 C1 A2 C2 B2 A3 C3,但是中注意各旅游团内部是按照顺序执行的

    三、下面来分几种情况:

    1、并行队列+同步执行
    解析:

    并行队列--->开了三个窗口
    同步执行----->只能三个旅游团排到一个窗口下面依次买票,所以一切需要按照顺序买票,各团内部也是按照顺序买票

    2、并行队列+异步执行
    解析:

    并行队列--->开了三个窗口
    异步执行--->可以以旅游团为单位,进行分散买票,但各旅游团内部需要按照顺序买票

    3、串行队列+同步执行
    解析:

    串行队列--->只开了一个窗口
    同步执行---->只能三个旅游团排到一个窗口下面依次买票,所以一切需要按照顺序买票,各团内部也是按照顺序买票

    4、串行队列+异步执行
    解析:

    串行队列--->只开了一个窗口
    异步执行---->可以以旅游团为单位,进行分散买票,但很遗憾,只有一个窗口是开着的,所以还是乖乖在这排着吧,所以结果是按照顺序一个一个买

    5、主队列+同步执行
    解析:

    主队列--->相当于串行队列,只开了一个窗口
    同步执行---->只能三个旅游团排到一个窗口下面依次买票,所以一切需要按照赵顺序买票,此时要注意,这里会产生死锁,在下面会讲

    6、主队列+异步执行
    解析:

    主队列--->相当于串行队列,只开了一个窗口
    异步执行---->可以以旅游团为单位,进行分散买票,但是很遗憾,只有一个窗口是开着的,所以还是乖乖在这排着吧,所以结果是按照顺序一个一个买

    四、死锁的概念

    先上一个代码

    -(void)syncMain {
           dispatch_sync(dispatch_get_main_queue(), ^{
                 NSLog(@"同步里面的")
           })
    }
    

    队列是采取先进先出的方式,在主队列里,方法syncMain先被压进了栈,然后又压了dispatch_sync这个方法,主队列需要先把syncMain执行完,才能执行dispatch_sync里面的方法,但是 dispatch_sync是在syncMain方法里面同步执行,syncMain方法需要等待dispatch_sync这个方法执行了才能往下进行,可是dispatch_sync又需要等待syncMain方法执行完他才能被队列送出执行,所以就造成了互相等待的死锁状态

    相关文章

      网友评论

          本文标题:iOS同步异步和队列的通俗理解

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