溫馨提示×

java實現分布式鎖的代碼怎么寫

小億
144
2023-10-23 16:17:15
欄目: 編程語言

在Java中實現分布式鎖可以使用以下幾種方式:
1. 基于數據庫的實現:
  - 創建一個數據庫表,表中有一個唯一索引字段用于標識鎖的名稱。
  - 在獲取鎖時,向數據庫中插入一條記錄,如果插入成功則表示獲取鎖成功。
  - 在釋放鎖時,刪除對應的記錄。
2. 基于Redis的實現:
  - 使用Redis的setnx命令(set if not exist)嘗試獲取鎖,如果返回1則表示獲取鎖成功。
  - 獲取鎖成功后設置一個過期時間,防止鎖一直被占用。
  - 在釋放鎖時,刪除對應的key。
下面是一個基于Redis的分布式鎖的示例代碼:
```java
import redis.clients.jedis.Jedis;
public class DistributedLock {
   private static final String LOCK_KEY = "distributed_lock";
   private static final int LOCK_EXPIRE_TIME = 30000;
   private Jedis jedis;
   private boolean locked = false;
   public DistributedLock(Jedis jedis) {
       this.jedis = jedis;
   }
   public boolean tryLock() {
       long now = System.currentTimeMillis();
       long expireTime = now + LOCK_EXPIRE_TIME + 1;
       String result = jedis.set(LOCK_KEY, String.valueOf(expireTime), "NX", "PX", LOCK_EXPIRE_TIME);
       if ("OK".equals(result)) {
           locked = true;
           return true;
       }
       return false;
   }
   public void unlock() {
       if (locked) {
           jedis.del(LOCK_KEY);
           locked = false;
       }
   }
}
```
使用示例:
```java
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class Main {
   public static void main(String[] args) {
       JedisPoolConfig poolConfig = new JedisPoolConfig();
       JedisPool jedisPool = new JedisPool(poolConfig, "localhost", 6379);
       Jedis jedis = jedisPool.getResource();
       DistributedLock lock = new DistributedLock(jedis);
       try {
           if (lock.tryLock()) {
               // 獲取鎖成功,執行業務邏輯
               System.out.println("獲取鎖成功");
           } else {
               // 獲取鎖失敗,執行其他邏輯
               System.out.println("獲取鎖失敗");
           }
       } finally {
           lock.unlock();
       }
       jedis.close();
       jedisPool.close();
   }
}
```
注意:上述代碼僅為示例,實際使用時需要考慮異常處理、鎖重入等情況。

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女