当前位置:  首页>> 技术小册>> Java面试指南

Java分布式锁介绍

Java分布式锁是一种在分布式系统中控制并发访问的机制,它可以防止多个进程同时访问共享资源,避免数据竞争和不一致性的问题。Java分布式锁可以应用于多种场景,如分布式任务调度、分布式事务处理等。

下面是一个简单的Java分布式锁示例代码,使用了Redis作为锁存储:

添加Redis依赖

  1. <dependency>
  2. <groupId>redis.clients</groupId>
  3. <artifactId>jedis</artifactId>
  4. <version>3.6.0</version>
  5. </dependency>

编写锁工具类

  1. import redis.clients.jedis.Jedis;
  2. public class RedisLockUtil {
  3. private static final String REDIS_HOST = "127.0.0.1";
  4. private static final int REDIS_PORT = 6379;
  5. private static final int REDIS_EXPIRE_TIME = 60; // 60 seconds
  6. private static final int RETRY_TIMES = 3;
  7. private static final long SLEEP_TIME = 100;
  8. private static Jedis jedis;
  9. static {
  10. jedis = new Jedis(REDIS_HOST, REDIS_PORT);
  11. }
  12. public static boolean tryLock(String key, String value) {
  13. for (int i = 0; i < RETRY_TIMES; i++) {
  14. String result = jedis.set(key, value, "NX", "EX", REDIS_EXPIRE_TIME);
  15. if ("OK".equals(result)) {
  16. return true;
  17. }
  18. try {
  19. Thread.sleep(SLEEP_TIME);
  20. } catch (InterruptedException e) {
  21. // ignore
  22. }
  23. }
  24. return false;
  25. }
  26. public static void unlock(String key, String value) {
  27. String result = jedis.get(key);
  28. if (value.equals(result)) {
  29. jedis.del(key);
  30. }
  31. }
  32. }

在这个工具类中,我们使用了Jedis库来操作Redis。在tryLock方法中,我们尝试获取锁,如果获取成功,我们返回true。如果获取失败,我们等待一段时间后重试,重试次数可以通过RETRY_TIMES变量来设置。在unlock方法中,我们首先获取锁的当前值,然后判断锁的当前值是否等于传入的值,如果相等,我们释放锁。

在业务代码中使用锁

  1. public class OrderService {
  2. public static void createOrder(Order order) {
  3. String key = "order_" + order.getId();
  4. String value = String.valueOf(System.currentTimeMillis());
  5. if (RedisLockUtil.tryLock(key, value)) {
  6. try {
  7. // 创建订单
  8. // ...
  9. } finally {
  10. RedisLockUtil.unlock(key, value);
  11. }
  12. } else {
  13. throw new RuntimeException("Failed to acquire lock for order " + order.getId());
  14. }
  15. }
  16. }

在这个业务代码中,我们使用了RedisLockUtil工具类来实现分布式锁。在createOrder方法中,我们首先根据订单ID生成锁键,然后尝试获取锁。如果获取锁成功,我们执行创建订单的逻辑,创建完成后释放锁。如果获取锁失败,我们抛出异常提示用户创建订单


该分类下的相关小册推荐: