java 分布式锁
时间: 2025-06-12 07:47:33 浏览: 15
### Java 实现分布式锁的解决方案及代码示例
#### ### 1. 基于 Redis 的分布式锁实现
Redis 是一种高性能的键值存储系统,可以通过 `SETNX` 命令实现分布式锁。以下是一个基于 Jedis 客户端的分布式锁实现示例[^2]。
```java
import redis.clients.jedis.Jedis;
public class RedisDistributedLock {
private Jedis jedis;
private String lockKey;
private String requestId;
public RedisDistributedLock(String host, int port) {
jedis = new Jedis(host, port);
lockKey = "myDistributedLock";
requestId = java.util.UUID.randomUUID().toString();
}
// 尝试获取锁
public boolean tryLock(int expireTime) {
long expires = System.currentTimeMillis() + expireTime + 1;
String result = jedis.set(lockKey, requestId, "NX", "PX", expireTime);
return "OK".equals(result);
}
// 释放锁
public void unlock() {
String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
jedis.eval(script, java.util.Collections.singletonList(lockKey), java.util.Collections.singletonList(requestId));
}
}
```
上述代码中,`tryLock` 方法通过 `SET` 命令的 `NX` 和 `PX` 参数尝试加锁,并设置过期时间以防止死锁。`unlock` 方法使用 Lua 脚本确保只有锁的拥有者才能释放锁[^2]。
#### ### 2. 基于 ZooKeeper 的分布式锁实现
ZooKeeper 提供了强大的分布式协调功能,可以通过创建临时顺序节点实现分布式锁。以下是基于 Curator 框架的分布式锁实现示例[^4]。
```java
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.locks.InterProcessMutex;
import org.apache.curator.retry.ExponentialBackoffRetry;
public class ZkDistributedLock {
private CuratorFramework client;
private InterProcessMutex lock;
public ZkDistributedLock(String zkAddress, String lockPath) {
client = CuratorFrameworkFactory.builder()
.connectString(zkAddress)
.retryPolicy(new ExponentialBackoffRetry(1000, 3))
.build();
client.start();
lock = new InterProcessMutex(client, lockPath);
}
// 获取锁
public void acquireLock() throws Exception {
lock.acquire();
}
// 释放锁
public void releaseLock() throws Exception {
lock.release();
}
}
```
上述代码中,`InterProcessMutex` 是 Curator 提供的可重入锁实现,能够确保在分布式环境下的线程安全。
#### ### 3. 使用 Redisson 实现分布式锁
Redisson 是一个成熟的 Redis 客户端库,提供了丰富的分布式锁功能。以下是使用 Redisson 实现分布式锁的示例代码[^5]。
```java
import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
public class RedissonDistributedLock {
private RedissonClient redisson;
private RLock lock;
public RedissonDistributedLock(String lockName) {
Config config = new Config();
config.useSingleServer().address("redis://127.0.0.1:6379");
redisson = Redisson.create(config);
lock = redisson.getLock(lockName);
}
// 获取锁
public void acquireLock() throws InterruptedException {
lock.lock();
}
// 释放锁
public void releaseLock() {
lock.unlock();
}
}
```
Redisson 提供了多种锁类型,包括公平锁、可重入锁和红锁(RedLock),开发者可以根据实际需求选择合适的锁类型[^5]。
#### ### 4. 多个分布式锁的扩展实现
如果需要支持多个分布式锁,可以为每个锁分配不同的锁名称或路径。例如,在 ZooKeeper 中,可以通过创建不同的锁路径来区分多个锁;在 Redis 中,可以通过设置不同的键名来实现[^1]。
```java
// 使用 Redisson 实现多个分布式锁
public class MultiRedissonLock {
private RedissonClient redisson;
public MultiRedissonLock() {
Config config = new Config();
config.useSingleServer().address("redis://127.0.0.1:6379");
redisson = Redisson.create(config);
}
public RLock getLock(String lockName) {
return redisson.getLock(lockName);
}
}
```
####
阅读全文
相关推荐


















