iOS多线程-思维导图、面试题及其答案

2026-03-03  本文已影响0人  巴糖

iOS 多线程完整知识体系

🧠 一、多线程思维导图

多线程
├── 1. 基础概念
│   ├── 进程(Process)与线程(Thread)
│   ├── 同步(Synchronous) vs 异步(Asynchronous)
│   ├── 串行(Serial) vs 并发(Concurrent)
│   ├── 线程安全(Thread Safety)与竞态条件(Race Condition)
│   ├── 上下文切换(Context Switch)
│   └── 死锁(Deadlock)
├── 2. iOS 多线程方案
│   ├── pthread(POSIX线程,C语言,跨平台,手动管理)
│   ├── NSThread(OC,面向对象,手动管理)
│   ├── GCD(Grand Central Dispatch,C语言,自动管理,基于队列)
│   │   ├── 函数
│   │   │   ├── dispatch_sync(同步派发)
│   │   │   └── dispatch_async(异步派发)
│   │   ├── 队列
│   │   │   ├── 串行队列(Serial Queue)
│   │   │   ├── 并发队列(Concurrent Queue)
│   │   │   ├── 主队列(Main Queue)
│   │   │   └── 全局并发队列(Global Concurrent Queue)
│   │   ├── 队列组(Dispatch Group)
│   │   ├── 栅栏(Dispatch Barrier)
│   │   ├── 信号量(Dispatch Semaphore)
│   │   ├── 数据源(Dispatch Source)
│   │   └── 死锁场景(Deadlock Scenarios)
│   └── NSOperationQueue(OC,面向对象,基于GCD)
│       ├── NSOperation 子类(NSInvocationOperation,NSBlockOperation)
│       ├── 特性:依赖(Dependency)、KVO、取消(Cancel)、最大并发数(MaxConcurrentOperationCount)
│       └── 对比 GCD
├── 3. 线程安全与锁
│   ├── 安全隐患
│   │   ├── 资源共享(Resource Sharing)
│   │   ├── 数据错乱(Data Corruption)
│   │   └── 死锁(Deadlock)
│   ├── 锁方案
│   │   ├── OSSpinLock(自旋锁,已废弃)
│   │   ├── os_unfair_lock(非公平锁,替代自旋锁)
│   │   ├── pthread_mutex(互斥锁,支持递归锁、条件锁)
│   │   ├── NSLock / NSRecursiveLock(递归锁)
│   │   ├── NSCondition(条件变量) / NSConditionLock(条件锁)
│   │   ├── dispatch_semaphore(信号量)
│   │   ├── @synchronized(同步锁)
│   │   ├── atomic(原子属性修饰符)
│   │   └── 串行队列实现同步(Serial Queue for Synchronization)
│   ├── 读写安全
│   │   ├── pthread_rwlock(读写锁)
│   │   └── dispatch_barrier_async(异步栅栏)
│   └── 自旋锁(Spinlock) vs 互斥锁(Mutex)
│       ├── 自旋锁:忙等(Busy-wait)、短临界区、多核
│       └── 互斥锁:休眠(Sleep)、长临界区、单核
├── 4. 常见问题与场景
│   ├── performSelector 延时与 RunLoop(运行循环)
│   ├── 主队列死锁(Main Queue Deadlock)
│   ├── 线程同步经典案例:存钱取钱、卖票
│   └── 多读单写(Multiple Readers Single Writer)实现
└── 5. 性能与源码
    ├── 锁性能对比(os_unfair_lock > dispatch_semaphore > ...)
    ├── GCD 源码:libdispatch
    ├── objc4 中的 @synchronized 实现
    └── atomic 实现:objc-accessors.mm

❓二、面试题及答案

下面列出 15 道核心面试题,每道题均包含 专业答案(按【初级掌握】【中级扩展】【高级深入】分层)和 通俗解释


1. 你理解的多线程?

【专业答案】

【通俗解释】

多线程就是让计算机同时干多件事。就像一个人(主线程)做饭,如果还要接电话,就会手忙脚乱;多线程就是多找几个人帮忙,各干各的,提高效率。但人多了容易吵架(数据错乱)或互相等死(死锁),需要一套管理规则。


2. iOS 的多线程方案有哪几种?你更倾向于哪一种?

【专业答案】

【通俗解释】

就像干活有不同的工具:GCD 像一把瑞士军刀,简单好用;NSOperationQueue 像工具箱,功能更多(可以设置任务依赖、取消等)。简单任务用 GCD,复杂任务用 NSOperationQueue。


3. GCD 的队列类型有哪些?

【专业答案】

【通俗解释】

队列就像任务管道:主队列是给主线程用的(只有一条路),串行队列也是一条路,一个一个来;并发队列是多个路,可以同时走;全局队列是公共道路。


4. OperationQueue 和 GCD 的区别,各自的优势?

【专业答案】

【通俗解释】

GCD 写起来快,像一把快刀;NSOperationQueue 像一把多功能军刀,可以随时取消任务,让任务排队等,适合复杂场景。


5. 线程安全的处理手段有哪些?

【专业答案】

【通俗解释】

给共享资源加把锁,一次只让一个人访问。锁的种类很多,各有特点。还可以用 GCD 的队列来串行化访问,或者用读写锁实现多读单写。


6. 你了解的锁有哪些?请对比自旋锁和互斥锁,并说明使用注意。

【专业答案】

【通俗解释】

自旋锁就像你在门口一直敲门,适合快速操作;互斥锁是先去睡觉,有人叫你再起来,适合慢操作。用锁时要小心,别把自己锁死(死锁)。不同锁的速度也不同,os_unfair_lock 最快。


7. 如何实现多读单写(读写安全)?

【专业答案】

【通俗解释】

读可以同时多人,写只能一个人,写的时候不能读。pthread_rwlock 是专门的读写锁,栅栏是利用 GCD 的特性实现的。


8. 什么是上下文切换?它对性能有什么影响?

【专业答案】

【通俗解释】

就像你正在看书,突然要去接电话,你需要记住看到哪一页(保存状态),接完电话再翻到那页(恢复状态)。频繁接电话就会浪费很多时间在翻书上。多线程切换也是一样,切换太多会拖慢速度。


9. 什么是 dispatch_source?有哪些应用场景?

【专业答案】

【通俗解释】

dispatch_source 就像一个小哨兵,专门盯着某些事情发生(比如时间到了、文件改了),然后通知你去做事。它比普通的定时器更可靠,不会因为你在刷朋友圈就耽误了。


10. NSCondition 和 NSConditionLock 的区别与使用?

【专业答案】

【通俗解释】

NSCondition 像是一个广播站,线程可以等待特定消息;NSConditionLock 像是一个密码锁,只有密码对了才能开门。


11. atomic 关键字的底层实现?它能保证绝对线程安全吗?

【专业答案】

【通俗解释】

atomic 就像给属性加了一把小锁,保证你拿的时候不会被人改,但如果你先拿了再去做别的事,中间还是可能出问题。所以它不是万能药。


12. 请简述 GCD 的线程池管理机制(基于源码理解)。

【专业答案】

【通俗解释】

GCD 就像一个调度中心,手底下有一群工人(线程)。任务来了,它会安排空闲的工人去做;工人不够就招新;工人闲着太久就让他们回家休息。这样既快又不浪费资源。


13. @synchronized 的底层实现原理?优缺点?

【专业答案】

【通俗解释】

@synchronized 就像给代码块贴了一个标签,标签对应的对象是谁,谁就是钥匙。同一时间只有拿着钥匙的人能进去。它很方便,但人多的时候有点慢。


14. 什么是死锁?如何避免死锁?

【专业答案】

【通俗解释】

死锁就像两个人互相挡住对方的出路,谁也别想走。要避免这种情况,就要事先约定好谁先走,或者让一个人主动让一下。


15. 什么是竞态条件?举例说明并给出解决方案。

【专业答案】

【通俗解释】

竞态条件就像两个人同时抢一个麦克风,结果谁都没拿到,或者同时讲话乱套了。解决办法是排队(加锁)或者指定一个人拿(原子操作)。


🧭 三、初中高工程师回答指南

初级工程师

中级工程师

高级工程师


📘 四、英文术语速查表

英文术语 中文解释 简要说明
Thread 线程 CPU 调度的最小单位
Process 进程 资源分配的基本单位,包含多个线程
Concurrency 并发 多个任务在同一个时间段内交替执行
Parallelism 并行 多个任务在同一时刻同时执行(多核)
Synchronous 同步 等待任务执行完成才返回
Asynchronous 异步 不等待任务执行,立即返回
Serial Queue 串行队列 任务一个接一个执行
Concurrent Queue 并发队列 任务可以同时执行
Deadlock 死锁 两个或多个线程互相等待对方释放资源
Race Condition 竞态条件 多个线程访问共享数据导致结果不确定
Thread Safety 线程安全 多个线程同时访问不会导致数据错乱
Mutex 互斥锁 一次只有一个线程进入临界区
Spinlock 自旋锁 线程忙等,不进入休眠
Semaphore 信号量 控制并发访问数量的同步原语
Read-Write Lock 读写锁 多读单写,提高读并发
Atomic 原子操作 不可被中断的操作,通常用于属性修饰
Barrier 栅栏 在并发队列中确保任务顺序
Dispatch Group 调度组 监控一组任务的完成
RunLoop 运行循环 处理事件和定时器的线程循环
Thread Pool 线程池 一组预先创建的线程,用于执行任务
Workqueue 工作队列 内核级线程管理机制,GCD 底层使用
Priority Inversion 优先级反转 高优先级线程等待低优先级线程释放锁
Context Switch 上下文切换 CPU 从一个线程切换到另一个线程
Memory Barrier 内存屏障 防止指令重排,保证内存操作顺序

以上是 iOS 多线程完整知识体系,覆盖了概念、方案、锁、常见问题、源码和面试准备。可作为学习、复习和面试的系统性资料。如有任何修改或补充需求,请随时告知。

上一篇 下一篇

猜你喜欢

热点阅读