面试官:分布式锁的 5 种实现方式?很多人答错

张开发
2026/4/7 21:35:41 15 分钟阅读

分享文章

面试官:分布式锁的 5 种实现方式?很多人答错
在高并发系统和微服务架构中分布式锁是保证数据一致性和操作互斥的核心手段。很多 Java 面试题都会问到分布式锁的实现方式但真正能清楚说出 5 种常见实现的人并不多。本文将从原理、代码示例到实际场景帮你彻底掌握分布式锁的精髓。[外链图片转存中…(img-664PJ2LA-1773653362664)]我整理了一套完整Java面试题库完整版在我的技术站https://myquotego.com/html/questions?_fromcsdn_123_1一、问题背景在单机环境下我们通常用synchronized或ReentrantLock控制并发。但在分布式环境中系统的多个节点可能同时访问同一资源如果没有分布式锁会出现以下问题数据冲突库存、余额等操作可能出现超卖或超扣。重复任务执行定时任务或消息队列重复消费。竞态条件多个服务同时修改共享状态导致系统不稳定。因此分布式锁应运而生用于跨进程、跨节点的同步控制。二、技术原理解析1. 数据库实现分布式锁原理利用数据库的唯一索引或SELECT … FOR UPDATE来控制锁。优点实现简单依赖已有数据库不需要额外组件。缺点性能低数据库成为瓶颈事务锁粒度大容易死锁。原理图示[外链图片转存中…(img-HSHcnvxy-1773653362665)]2. Redis 实现分布式锁原理使用SET key value NX PX timeout原子命令设置锁。优点性能高支持超时释放适合高并发。缺点需要处理锁过期、网络分区导致锁误释放问题。核心算法单机 RedisSET NX PXRedisson基于 Redis 的高可靠分布式锁实现支持可重入和可续期。3. ZooKeeper 实现分布式锁原理利用 ZooKeeper 的顺序临时节点特性实现锁。优点锁的可靠性高节点宕机自动释放锁。缺点ZooKeeper 集群成本高性能低于 Redis。原理步骤创建临时顺序节点/lock/node-0001获取节点列表判断自己是否最小序号如果不是监听前一个节点的删除事件等待锁释放4. Etcd 实现分布式锁原理利用 Etcd 的lease key特性实现锁。优点强一致性高可用适合云原生架构。缺点需要掌握 Etcd API 和 Lease 概念。核心思路PUT /lock/my-lock key with lease 如果 PUT 成功则获取锁 Lease 到期或主动释放锁其他节点可重试5. RedLock 算法RedLock 是 Redis 官方推荐的分布式锁算法适合多 Redis 节点部署。原理在 N 个独立 Redis 节点上尝试加锁。获取超过一半节点锁才算成功。设置锁过期时间防止死锁。优点可靠性高解决单点 Redis 宕机问题。缺点实现复杂需要多个 Redis 节点。我整理了一套完整Java面试题库完整版在我的技术站https://myquotego.com/html/questions?_fromcsdn_123_1三、代码示例1. 数据库锁示例TransactionalpublicvoidupdateStock(LongproductId){// SELECT ... FOR UPDATE 会锁住行ProductproductproductRepository.findByIdForUpdate(productId);if(product.getStock()0){product.setStock(product.getStock()-1);productRepository.save(product);}}2. Redis 分布式锁JedisStringlockKeyorder_lock;StringrequestIdUUID.randomUUID().toString();Stringresultjedis.set(lockKey,requestId,SetParams.setParams().nx().px(5000));if(OK.equals(result)){try{// 执行业务}finally{// 释放锁Stringluaif redis.call(get, KEYS[1]) ARGV[1] then return redis.call(del, KEYS[1]) else return 0 end;jedis.eval(lua,Collections.singletonList(lockKey),Collections.singletonList(requestId));}}3. ZooKeeper 锁示例CuratorInterProcessMutexlocknewInterProcessMutex(curatorFramework,/my-lock);try{if(lock.acquire(5,TimeUnit.SECONDS)){// 执行业务}}finally{lock.release();}4. Etcd 分布式锁示例Java clientLeaseleaseclient.getLeaseClient().grant(5).get();booleanacquiredclient.getLockClient().lock(ByteSequence.from(my-lock,UTF_8),lease.getID()).isDone();if(acquired){try{// 执行业务}finally{client.getLockClient().unlock(ByteSequence.from(my-lock,UTF_8));}}5. RedLockRedissonConfigconfignewConfig();config.useSingleServer().setAddress(redis://127.0.0.1:6379);RedissonClientredissonRedisson.create(config);RLocklockredisson.getLock(myLock);booleanisLockedlock.tryLock(5,10,TimeUnit.SECONDS);if(isLocked){try{// 执行业务}finally{lock.unlock();}}我整理了一套完整Java面试题库完整版在我的技术站https://myquotego.com/html/questions?_fromcsdn_123_1四、实际应用场景秒杀系统多个用户同时下单Redis 分布式锁可防止库存超卖。分布式任务调度定时任务在多节点部署时ZooKeeper/Etcd 可确保任务只执行一次。资金账户操作银行或支付系统使用数据库或 RedLock 实现锁确保余额一致性。共享资源管理分布式缓存更新、文件上传等场景。五、总结分布式锁是高并发系统必备技能掌握以下关键点理解原理每种实现方式的适用场景和优缺点。选型策略Redis 性能高ZooKeeper/Etcd 高可靠RedLock 多节点安全。业务实践秒杀、支付、任务调度都是分布式锁的常见应用。关注我持续更新Java面试核心知识。

更多文章