Java实现一个分布式锁
时间: 2023-06-29 12:05:46 浏览: 90
Java实现分布式锁有很多种方式,其中比较常用的是基于Redis实现的分布式锁。以下是一个使用Redis作为分布式锁的简单实现:
1. 引入Redis客户端依赖
在项目的pom.xml文件中添加Redis客户端的依赖:
```xml
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.5.2</version>
</dependency>
```
2. 获取Redis连接
```java
Jedis jedis = new Jedis("localhost", 6379);
```
3. 加锁
```java
public boolean lock(String key, String val, int expireTime) {
String result = jedis.set(key, val, "NX", "PX", expireTime);
return "OK".equals(result);
}
```
其中,key表示要加锁的资源的唯一标识,val表示当前线程的标识,expireTime表示锁的过期时间。
4. 解锁
```java
public boolean unlock(String key, String val) {
String value = jedis.get(key);
if (value != null && value.equals(val)) {
jedis.del(key);
return true;
}
return false;
}
```
其中,key和val参数与加锁方法中的相同,如果当前线程持有该锁,则删除对应的key。
完整的分布式锁实现代码如下:
```java
public class DistributedLock {
private Jedis jedis;
public DistributedLock() {
this.jedis = new Jedis("localhost", 6379);
}
public boolean lock(String key, String val, int expireTime) {
String result = jedis.set(key, val, "NX", "PX", expireTime);
return "OK".equals(result);
}
public boolean unlock(String key, String val) {
String value = jedis.get(key);
if (value != null && value.equals(val)) {
jedis.del(key);
return true;
}
return false;
}
}
```
使用时可以创建一个DistributedLock对象,然后调用lock()方法加锁,unlock()方法解锁。需要注意的是,在使用完锁之后一定要及时释放,否则可能会导致其它线程无法获取到该资源的锁。
相关推荐
![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_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)
![](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)