Jerry Lee

stay hungry,stay young.

Welcome to my world.


多线程gcd(一)


(一)各种队列的执行效果

1.常见的多线程方案 WX20180802-165249.png-116.1kB 2.同步和异步的主要影响:能不能开启新的线程 同步:在当前的线程中执行任务,不具备开启新线程的能力 异步:在新的线程中开启任务,具备开启新线程的能力

3.并发和串行的主要影响:任务的执行方式 并发:多个任务并发(同时)执行 串行:一个任务执行完毕之后,再执行下个任务 队列的类型包括: 并发队列,串行队列,主队列(也是一个串行队列) 决定了任务的执行方式(并发,串行)

WX20180802-165032.png-82kB

(二)常见的死锁案例

使用sync函数往当前串行队列中添加任务,会卡住当前的串行队列(产生死锁)

1.产生死锁

NSLog(@"任务1");

dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_sync(mainQueue, ^{
    NSLog(@"任务2");
});
NSLog(@"任务3");

2.不会产生死锁

NSLog(@"任务1");

dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_async(mainQueue, ^{
    NSLog(@"任务2");
});
NSLog(@"任务3");

3.产生死锁(sync并且是串行队列粗体文本)

    NSLog(@"任务1");
dispatch_queue_t queue = dispatch_queue_create("myqueu", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
    NSLog(@"任务2");

    dispatch_sync(queue, ^{
        NSLog(@"任务3");

    });
    NSLog(@"任务4");

});
NSLog(@"任务5");

4.不会产生死锁(不是同一个队列)

  NSLog(@"任务1");
dispatch_queue_t queue = dispatch_queue_create("myqueue", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t queue2 = dispatch_queue_create("myqueue2", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
    NSLog(@"任务2");
    dispatch_sync(queue2, ^{
        NSLog(@"任务3");

    });
    NSLog(@"任务4");
});
NSLog(@"任务5");

5.不产生死锁(并发队列)

 NSLog(@"任务1");
dispatch_queue_t queue = dispatch_queue_create("myqueu", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
    NSLog(@"任务2");
    dispatch_sync(queue, ^{
        NSLog(@"任务3");
    });
    NSLog(@"任务4");
});
NSLog(@"任务5");

最近的文章

Kvo的本质

KVO的全称是Key -Value Observing,即“键值监听”,可用于监听某个对象属性值的改变代码实现结果输出可以看到我们只监听了person1属性值改变,所以只输出person1的改变。那问题来了,我们给person1,person2都改变了age属性的值,本质都是调用了LGPerson类中setAge这个方法,那么为什么person1会走到oberveValueForKeyPath这个方法,person2不会呢?KVO底层实现分析———我们断点打印一下person1和perso...…

继续阅读
更早的文章

Cocoapods创建私有库(二)

接着上篇文章,用Cocoapods创建私有库,完成了我们自己的私有库制作,在接下来的开发工作中,可能会根据需求去更新我们的私有库,本篇文章分享下更新私有库的经历。一.更新具体做法是将要添加的源文件放到Pod/Classes中,然后编辑.podspec文件。编程完成后,本地验证下本地验证通过之后,就可以推送到远端了。这里面有个坑,就是要push tag,由于我漏了这一步,出现了一下问题。可以尝试如下代码git tag -m “update tag” 1.0.1git push –tags然后...…

继续阅读