面试题答案
一键面试1. 改进现有锁机制
- 使用更细粒度的锁
- 优点:减少锁的竞争范围,提高并发度。例如,将对整个数据结构加锁改为对数据结构中的不同部分分别加锁,这样不同线程可以同时访问数据结构的不同部分。
- 缺点:增加代码复杂度,需要更精细地管理锁的粒度和边界,容易出现死锁情况。
- 优化锁的持有时间
- 优点:尽量缩短锁的持有时间,让其他线程能更快获取锁,提升整体性能。比如,在锁内只执行必要的操作,将一些无关操作移到锁外。
- 缺点:需要对业务逻辑有深入理解,确保移到锁外的操作不会破坏数据一致性等问题。
2. 引入新的并发控制技术
- 读写锁(Read - Write Lock)
- 优点:适合读多写少的场景,允许多个线程同时读共享资源,只有写操作时才需要独占锁。这样可以大大提高读操作的并发性能。
- 缺点:如果写操作频繁,会导致读线程长时间等待,可能出现写饥饿现象。而且读写锁的实现和使用相对复杂。
- 信号量(Semaphore)
- 优点:可以控制同时访问共享资源的线程数量,比互斥锁更加灵活。适用于限制资源访问数量的场景,如数据库连接池。
- 缺点:使用不当可能导致线程过度竞争信号量,同样出现性能问题,并且也需要仔细设计信号量的初始值和使用逻辑。
- 原子操作(Atomic Operations)
- 优点:对于简单数据类型的操作,使用原子操作无需加锁,性能高且代码简洁。例如对
NSAtomicInteger
类型变量的操作。 - 缺点:只能用于一些简单的原子操作,对于复杂数据结构或操作无法直接使用,适用范围有限。
- 优点:对于简单数据类型的操作,使用原子操作无需加锁,性能高且代码简洁。例如对
- Grand Central Dispatch (GCD)
- 优点:基于队列的异步编程模型,自动管理线程的生命周期,减少线程创建和销毁的开销。提供了方便的并发控制机制,如并发队列和同步队列,可以根据业务需求灵活配置。并且GCD对多核处理器有很好的优化,能充分利用多核性能。
- 缺点:如果对GCD理解不深入,使用不当可能会导致死锁或其他难以调试的问题。而且对于一些复杂的同步需求,可能需要更多的代码来实现。
- NSOperationQueue
- 优点:提供了一种基于队列的任务管理方式,可以方便地控制任务的优先级、依赖关系等。通过设置队列的最大并发数,可以有效控制并发度。
- 缺点:相比GCD,NSOperationQueue的使用相对复杂,需要创建
NSOperation
子类或使用NSBlockOperation
来封装任务,配置和管理任务依赖关系也需要更多代码。