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