java 实现分布式锁 实例
时间: 2023-10-15 20:04:28 浏览: 57
好的,以下是一个简单的 Java 实现分布式锁的示例代码:
```java
import redis.clients.jedis.Jedis;
public class DistributedLock {
private static final String LOCK_KEY = "mylock"; // 锁的键名
private static final int LOCK_EXPIRE = 30000; // 锁的过期时间,单位毫秒
private Jedis jedis; // Redis 客户端
public DistributedLock(Jedis jedis) {
this.jedis = jedis;
}
/**
* 获取分布式锁
* @return 是否成功获取锁
*/
public boolean acquire() {
long now = System.currentTimeMillis();
long expireTime = now + LOCK_EXPIRE + 1; // 锁的过期时间
String expireStr = String.valueOf(expireTime);
if (jedis.setnx(LOCK_KEY, expireStr) == 1) { // 成功获取锁
return true;
}
String currentValueStr = jedis.get(LOCK_KEY);
if (currentValueStr != null && Long.parseLong(currentValueStr) < now) { // 锁已经过期
String oldValueStr = jedis.getSet(LOCK_KEY, expireStr);
if (oldValueStr != null && oldValueStr.equals(currentValueStr)) { // 判断是否有其他进程已经获取了锁
return true;
}
}
return false;
}
/**
* 释放分布式锁
*/
public void release() {
String currentValueStr = jedis.get(LOCK_KEY);
if (currentValueStr != null) {
jedis.del(LOCK_KEY);
}
}
// 使用示例
public static void main(String[] args) {
Jedis jedis = new Jedis("localhost"); // 连接本地 Redis 服务
DistributedLock lock = new DistributedLock(jedis);
if (lock.acquire()) { // 获取锁成功
try {
// TODO: 执行需要加锁的业务逻辑
} finally {
lock.release(); // 释放锁
}
} else { // 获取锁失败
System.out.println("获取锁失败");
}
}
}
```
以上代码使用 Redis 实现分布式锁,具体实现思想是使用 Redis 的 SETNX 命令尝试获取锁,如果 SETNX 返回 1,则表示成功获取锁;如果 SETNX 返回 0,则表示锁已经存在,需要判断锁是否已经过期,如果锁已经过期,则使用 GETSET 命令尝试获取锁。如果 GETSET 返回的值等于之前获取的值,则表示成功获取锁;如果 GETSET 返回的值不等于之前获取的值,则表示锁已经被其他进程获取。释放锁时,使用 DEL 命令删除锁的键。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)