MST

星途 面试题库

面试题:Objective-C中GCD与NSLock在可变对象线程安全操作上的比较与应用场景

在Objective-C开发中,Grand Central Dispatch (GCD) 和NSLock都可以用于实现线程安全的可变对象操作。请详细阐述它们在原理、性能以及适用场景上的区别,并举例说明在何种情况下应优先选择GCD,何种情况下应优先选择NSLock。
23.9万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

原理区别

  • GCD:基于队列(dispatch queue)来管理任务。有串行队列和并行队列,任务会被分发到这些队列中按顺序或并发执行。它使用的是队列调度机制,系统会自动管理线程的创建、销毁和复用。例如,将任务提交到全局并行队列,系统会根据CPU核心数等资源情况,自动分配线程来执行这些任务。
  • NSLock:是一种简单的互斥锁。当一个线程获取到锁后,其他线程如果尝试获取锁就会被阻塞,直到该线程释放锁。它基于信号量机制实现,通过控制信号量的值来决定是否允许线程进入临界区。

性能区别

  • GCD:在多核设备上,对于可以并行执行的任务,GCD利用系统底层的优化,能充分利用多核资源,性能优势明显。例如,进行大量数据的并行计算任务时,GCD能显著提高执行效率。同时,由于系统管理线程,减少了线程创建和销毁的开销。
  • NSLock:在多线程竞争锁频繁的情况下,会因为线程的阻塞和唤醒带来较大开销,性能会受到影响。因为每次获取和释放锁都需要进行内核态和用户态的切换,这个过程相对耗时。

适用场景区别

  • 优先选择GCD的场景
    • 任务并行处理:比如图片的批量处理,将每张图片的处理任务提交到并行队列,可同时处理多张图片,提高处理速度。例如,在一个图片编辑APP中,需要对多张图片同时进行滤镜处理,使用GCD的并行队列可以高效完成。
    • 异步任务执行:当需要在后台执行一些不影响主线程的任务,如网络请求、数据缓存等。例如,在一个新闻APP中,在后台下载新闻图片,同时主线程可以继续响应用户交互。
  • 优先选择NSLock的场景
    • 简单的临界区保护:当只有少量代码需要进行线程安全保护,且逻辑较为简单时,使用NSLock简单直接。例如,在一个多线程访问的计数器类中,每次对计数器的增减操作只需要简单加锁保护即可。
    • 需要手动控制锁的获取和释放顺序:某些复杂业务逻辑中,需要精确控制不同线程对资源的访问顺序,NSLock可以满足这种需求。例如,在一个多线程操作数据库的场景中,需要确保特定的事务顺序,NSLock能更好地实现这种控制。