面试题答案
一键面试NSArray
- 性能与安全问题
- 性能问题:多线程同时读取NSArray可能导致缓存争用,影响性能。
- 安全问题:多线程读写NSArray可能导致数据不一致,比如一个线程正在添加元素,另一个线程同时读取,可能读到不完整的数据;读写操作交叉可能导致程序崩溃。
- 解决方案
- 使用线程锁(如NSLock)
- 优点:实现简单,能有效保证数据一致性,适用于对性能要求不是极高,代码结构简单的场景。
- 缺点:锁的竞争会带来性能开销,特别是在高并发情况下,可能会导致线程阻塞,降低整体效率。
- 适用场景:读写操作频率不高,对数据一致性要求严格,并发量不大的场景。
- 使用线程安全的集合类(如NSMutableArray的线程安全子类,在iOS 10.0+有一些改进)
- 优点:使用方便,无需手动管理锁,性能相对锁机制在高并发下有一定提升。
- 缺点:依赖特定的系统版本,并且内部实现可能有一定的性能损耗,比如为了保证线程安全引入额外的同步机制。
- 适用场景:在支持的系统版本下,对代码简洁性有要求,且有一定并发读写需求的场景。
- 使用线程锁(如NSLock)
NSDictionary
- 性能与安全问题
- 性能问题:同NSArray,多线程同时访问会有缓存争用问题,影响性能。
- 安全问题:多线程读写NSDictionary可能导致数据不一致,比如一个线程修改字典结构(添加、删除键值对),另一个线程读取,可能读到错误的数据或者程序崩溃。
- 解决方案
- 使用读写锁(如pthread_rwlock)
- 优点:区分读和写操作,允许多个线程同时读,提高读操作的并发性能,适用于读多写少的场景。
- 缺点:实现相对复杂,需要手动管理锁的生命周期和状态。如果写操作频繁,可能会导致读线程长时间等待。
- 适用场景:读操作远多于写操作,对读性能有较高要求的场景。
- 使用dispatch_queue进行串行化操作
- 优点:利用GCD的特性,简单高效,通过将所有对字典的操作放在同一个队列中执行,保证操作的串行化,从而避免数据不一致问题。
- 缺点:如果队列中任务较多,会有一定的延迟,并且在高并发场景下,由于串行化操作,整体性能可能不如读写锁优化的场景。
- 适用场景:对操作延迟要求不高,希望利用GCD简单实现线程安全的场景。
- 使用读写锁(如pthread_rwlock)