Java分布式锁是一种在分布式系统中控制并发访问的机制,它可以防止多个进程同时访问共享资源,避免数据竞争和不一致性的问题。Java分布式锁可以应用于多种场景,如分布式任务调度、分布式事务处理等。
下面是一个简单的Java分布式锁示例代码,使用了Redis作为锁存储:
添加Redis依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.6.0</version>
</dependency>
编写锁工具类
import redis.clients.jedis.Jedis;
public class RedisLockUtil {
private static final String REDIS_HOST = "127.0.0.1";
private static final int REDIS_PORT = 6379;
private static final int REDIS_EXPIRE_TIME = 60; // 60 seconds
private static final int RETRY_TIMES = 3;
private static final long SLEEP_TIME = 100;
private static Jedis jedis;
static {
jedis = new Jedis(REDIS_HOST, REDIS_PORT);
}
public static boolean tryLock(String key, String value) {
for (int i = 0; i < RETRY_TIMES; i++) {
String result = jedis.set(key, value, "NX", "EX", REDIS_EXPIRE_TIME);
if ("OK".equals(result)) {
return true;
}
try {
Thread.sleep(SLEEP_TIME);
} catch (InterruptedException e) {
// ignore
}
}
return false;
}
public static void unlock(String key, String value) {
String result = jedis.get(key);
if (value.equals(result)) {
jedis.del(key);
}
}
}
在这个工具类中,我们使用了Jedis库来操作Redis。在tryLock方法中,我们尝试获取锁,如果获取成功,我们返回true。如果获取失败,我们等待一段时间后重试,重试次数可以通过RETRY_TIMES变量来设置。在unlock方法中,我们首先获取锁的当前值,然后判断锁的当前值是否等于传入的值,如果相等,我们释放锁。
在业务代码中使用锁
public class OrderService {
public static void createOrder(Order order) {
String key = "order_" + order.getId();
String value = String.valueOf(System.currentTimeMillis());
if (RedisLockUtil.tryLock(key, value)) {
try {
// 创建订单
// ...
} finally {
RedisLockUtil.unlock(key, value);
}
} else {
throw new RuntimeException("Failed to acquire lock for order " + order.getId());
}
}
}
在这个业务代码中,我们使用了RedisLockUtil工具类来实现分布式锁。在createOrder方法中,我们首先根据订单ID生成锁键,然后尝试获取锁。如果获取锁成功,我们执行创建订单的逻辑,创建完成后释放锁。如果获取锁失败,我们抛出异常提示用户创建订单