面试题答案
一键面试处理锁竞争的方法及优缺点
- 基于轮询的方式
- 方法:当一个线程或进程获取锁失败后,按照一定的时间间隔不断尝试获取锁,直到成功获取锁。
- 优点:实现简单,易于理解和实现。
- 缺点:
- 浪费系统资源,在不断轮询过程中会占用 CPU 资源,尤其在高并发场景下,大量无效的轮询会使系统性能下降。
- 响应时间不确定,可能需要等待较长时间才能获取到锁,这对于对响应时间敏感的业务场景不太适用。
- 使用队列
- 方法:将获取锁失败的线程或进程放入一个队列中,当锁被释放时,按照队列的顺序依次唤醒等待的线程或进程来获取锁。
- 优点:
- 公平性好,能够保证每个请求按照顺序获取锁,避免某些请求长时间等待。
- 相比轮询方式,不会造成大量无效的资源消耗,因为等待的线程或进程处于等待状态,不会占用 CPU 资源。
- 缺点:
- 实现相对复杂,需要额外维护一个队列数据结构以及相关的入队、出队操作逻辑。
- 队列操作本身可能带来一些性能开销,比如锁的竞争可能发生在队列操作上,影响整体性能。
- 利用 Redis 的发布订阅机制
- 方法:获取锁失败的线程或进程订阅一个特定的频道,当持有锁的线程或进程释放锁时,通过发布消息到该频道,通知订阅的线程或进程重新尝试获取锁。
- 优点:
- 解耦性好,发布者(释放锁的一方)和订阅者(等待获取锁的一方)之间不需要直接交互,降低了系统的耦合度。
- 异步通知,当锁释放时能够及时通知等待的线程或进程,相比轮询方式能够更及时地响应锁的变化。
- 缺点:
- 消息可能丢失,如果在发布消息和订阅者接收消息之间出现网络问题等异常情况,可能导致部分订阅者无法收到通知。
- 增加系统复杂性,需要引入 Redis 的发布订阅功能,并且要处理好消息的可靠性等相关问题。
- 采用分布式协调服务(如 ZooKeeper)辅助
- 方法:利用 ZooKeeper 的树形结构和临时有序节点特性来实现锁。每个尝试获取锁的线程或进程在 ZooKeeper 中创建一个临时有序节点,通过比较节点序号确定获取锁的顺序。
- 优点:
- 具备高可靠性和强一致性,ZooKeeper 自身的特性保证了锁的获取和释放过程的可靠性和一致性。
- 公平性高,与基于队列的方式类似,能够保证请求按照顺序获取锁。
- 缺点:
- 引入额外的系统,增加了系统的部署和维护成本,需要对 ZooKeeper 有深入的了解和管理能力。
- 性能方面,ZooKeeper 的写操作性能相对 Redis 可能较低,因为其要保证数据的一致性,在高并发写锁场景下可能成为性能瓶颈。