美文网首页
多线程知识小记

多线程知识小记

作者: 没有黑眼圈de熊猫 | 来源:发表于2018-02-21 17:59 被阅读8次

    1.锁必须是全局唯一的,加锁的前提条件是:多线程共享同一块资源。

    加锁是需要代价的,加锁是耗费性能的。加锁的结果是:线程同步

    @synchronized(锁对象)   { 需要锁定的代码 }

    注意:锁定一份代码只用一把锁,用多把锁是无效的

    互斥锁的优缺点:

    优点:能有效防止因多线程抢夺资源造成的数据安全问题

    缺点:需要消耗大量的CPU资源

    线程同步的意思是:多条线程在同一条线上执行(按顺序的执行任务)

    任务: 同步(不具备开启新线程的权利),异步(具备开启新线程的权利)

    队列:串行(一个任务执行完毕后再执行下一个任务) 并行(允许多个任务同时执行)

    同步函数:立刻马上执行,如果没有执行完,那么后面的也别想执行

    异步函数:如果我没有执行完毕,那么后面的也可以执行

    异步函数+并发队列:会开启多条线程,队列中的任务是异步执行,没有顺序

    异步函数 +串行队列:会开启线程,开一条线程,队列中的任务是串行执行的

    异步函数+ 主队列:所有任务都在主线程中执行,不会开线程

    同步函数+主队列:死锁。

    注意:如果该方法在子线程中执行,那么所有的任务在主线程中执行

    同步函数+并发队列:不会开启线程,队列中的任务是串行执行

    同步函数+串行队列:不会开启线程,队列中的人数是串行执行

    并不是多少个任务开启多少个线程。开启线程数目是不确定的。

    全局队列也是并发队列,全局的并发队列。

    主队列是串行队列,但是所有任务都在主线程中执行

    主队列特点:如果主队列发现当前主线程有任务在执行,那么主队列会暂停调用队列中的任务,知道主线程空闲为止。

    栅栏函数

    dispatch_barrier_async(queue, ^{

        });

    栅栏函数:不能使用全局并发队列

    栅栏函数可以控制多线程异步的执行顺序

    快速迭代函数:

    /*

         第一个函数:遍历的次数

         第二个函数:队列(并发队列)

         第三个函数:index 索引

         */

    dispatch_apply(10, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(size_t index) {

            NSLog(@"----%zd---%@",index,[NSThread currentThread]);

        });

    队列组:

    dispatch_group_t group = dispatch_group_create();

    //拦截通知,内部本身是异步的

        dispatch_group_notify(group, queue, ^{

            NSLog(@"----dispatch_group_notify-----");

        });

     将队列放到队列组里面执行,此通知可以在所有任务执行完毕后调用。

    等待函数   DISPATCH_TIME_FOREVER死等 知道队列组里面的任务全部执行完毕之后才能执行    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

    相关文章

      网友评论

          本文标题:多线程知识小记

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