多线程知识小记

2018-02-21  本文已影响8人  没有黑眼圈de熊猫

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);

上一篇下一篇

猜你喜欢

热点阅读