java 分布式锁代码
时间: 2023-07-06 12:39:18 浏览: 79
java分布式锁实现代码
以下是一个基于 Redis 的 Java 分布式锁的示例代码:
```java
import redis.clients.jedis.Jedis;
public class RedisDistributedLock {
private Jedis jedis;
private String lockKey;
private int expireTime;
private boolean locked = false;
public RedisDistributedLock(Jedis jedis, String lockKey, int expireTime) {
this.jedis = jedis;
this.lockKey = lockKey;
this.expireTime = expireTime;
}
public boolean lock() {
long nowTime = System.currentTimeMillis();
long expireTime = nowTime + this.expireTime + 1;
String expireStr = String.valueOf(expireTime);
if (this.jedis.setnx(this.lockKey, expireStr) == 1) {
this.locked = true;
return true;
}
String currentValueStr = this.jedis.get(this.lockKey);
if (currentValueStr != null && Long.parseLong(currentValueStr) < nowTime) {
String oldValueStr = this.jedis.getSet(this.lockKey, expireStr);
if (oldValueStr != null && oldValueStr.equals(currentValueStr)) {
this.locked = true;
return true;
}
}
return false;
}
public void unlock() {
if (this.locked) {
this.jedis.del(this.lockKey);
this.locked = false;
}
}
}
```
使用示例:
```java
Jedis jedis = new Jedis("localhost");
RedisDistributedLock lock = new RedisDistributedLock(jedis, "my_lock", 3000);
if (lock.lock()) {
try {
// 获得锁后的业务处理
} finally {
lock.unlock();
}
}
```
这个示例代码基于 Redis 实现了一个简单的分布式锁。使用 `setnx` 命令尝试设置锁,如果返回值为 1,则表示获取到了锁;否则通过 `get` 命令获取当前锁的过期时间,判断锁是否已经过期,如果过期则使用 `getset` 命令设置新的过期时间并返回旧的过期时间,如果旧的过期时间等于之前获取的过期时间,则表示获取到了锁。在获取到锁之后,可以进行业务处理,处理完成后需要调用 `unlock` 方法释放锁。
阅读全文