在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();
}
}
```
注意:上述代碼僅為示例,實際使用時需要考慮異常處理、鎖重入等情況。