美文网首页
多线程相关面试问题

多线程相关面试问题

作者: 骑着毛驴走起来 | 来源:发表于2019-11-01 16:49 被阅读0次

    多线程:GCD、NSOperation、NSThread。

    一、GCD

    1、同步/异步 和 串行/并发
    (1)、同步串行 dispatch_sync(serial_queue , ^{ //任务 });

    屏幕快照 2019-08-28 下午10.23.15.png 屏幕快照 2019-08-28 下午10.25.02.png 屏幕快照 2019-08-28 下午10.27.05.png 屏幕快照 2019-08-28 下午10.28.41.png

    (2)、异步串行 dispatch_async(serial_queue , ^{ //任务 });

    屏幕快照 2019-09-08 下午5.50.15.png

    (3)、同步并发 dispatch_sync(concurrent_queue , ^{ //任务 });

    屏幕快照 2019-09-08 下午5.47.33.png

    (4)、异步并发 dispatch_async(concurrent_queue , ^{ //任务 });

    屏幕快照 2019-09-08 下午5.52.58.png

    2、dispatch_barrier_async
    多读单写方案:dispatch_barrier_async(concurrent_queue , ^{ //写操作 });

    屏幕快照 2019-08-28 下午10.45.20.png 屏幕快照 2019-08-28 下午10.45.34.png
    @interface UserCenter()
    {
        // 定义一个并发队列
        dispatch_queue_t concurrent_queue;
        
        // 用户数据中心, 可能多个线程需要数据访问
        NSMutableDictionary *userCenterDic;
    }
    
    @end
    
    // 多读单写模型
    @implementation UserCenter
    
    - (id)init
    {
        self = [super init];
        if (self) {
            // 通过宏定义 DISPATCH_QUEUE_CONCURRENT 创建一个并发队列
            concurrent_queue = dispatch_queue_create("read_write_queue", DISPATCH_QUEUE_CONCURRENT);
            // 创建数据容器
            userCenterDic = [NSMutableDictionary dictionary];
        }
        
        return self;
    }
    
    - (id)objectForKey:(NSString *)key
    {
        __block id obj;
        // 同步读取指定数据
        dispatch_sync(concurrent_queue, ^{
            obj = [userCenterDic objectForKey:key];
        });
        
        return obj;
    }
    
    - (void)setObject:(id)obj forKey:(NSString *)key
    {
        // 异步栅栏调用设置数据
        dispatch_barrier_async(concurrent_queue, ^{
            [userCenterDic setObject:obj forKey:key];
        });
    }
    
    @end
    

    3、dispatch_group

    二、NSOperation

    需要和NSOperationQueue配合使用来实现多线程方案。
    1、特点:添加任务依赖、任务执行状态监控、最大并发数。
    2、任务执行状态控制:isReady、isExecuting、isFinished、isCancelled。
    3、状态监控
    如果只重写main方法,底层控制变更任务执行完成状态,以及任务退出。
    如果重写start方法,需自行控制任务状态。
    4、系统是咋样移除一个isFinished=YES的NSOperation的?
    通过KVO

    三、NSThread

    屏幕快照 2019-09-08 下午6.44.12.png

    四、锁

    iOS当中都有哪些锁?
    @synchronized、atomic、OSSpinLock、NSRecursiveLock、NSLock、dispatch_semaphore_t。

    1、@synchronized:一般在创建单例对象的时候使用。
    2、atomic:修饰属性的关键字;对被修饰对象进行原子操作(不负责使用,只负责赋值)。

    屏幕快照 2019-09-08 下午6.54.59.png

    3、OSSpinLock:自旋锁
    循环等待询问,不释放当前资源。
    用于轻量级数据访问,简单的int值+1/-1操作。
    4、NSLock

    屏幕快照 2019-09-08 下午7.01.07.png

    5、NSRecursiveLock 递归锁

    屏幕快照 2019-09-08 下午7.02.07.png

    6、dispatch_semaphore_t 信号量

    屏幕快照 2019-09-08 下午7.03.28.png

    多线程相关面试问题

    1、咋样用GCD实现多读单写?
    2、iOS系统为我们提供的几种多线程技术各自的特点是咋样的?
    答案:GCD、NSOperation、NSThread。
    GCD:简单的线程间同步,包括子线程分派、多读单写等场景的解决。
    NSOperation:第三方框架AF,SD都会涉及到NSOperation,他可以对任务的状态进行控制,可以添加依赖,删除依赖。
    NSThread:实现常驻线程。
    3、NSOperation对象在Finished之后是咋样从queue当中移除掉的?
    4、你都用过哪些锁?结合实际谈谈你是咋样使用的?

    相关文章

      网友评论

          本文标题:多线程相关面试问题

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