java实现分布式锁代码
时间: 2023-06-29 15:21:06 浏览: 45
以下是基于Redis实现分布式锁的Java代码示例:
```java
import redis.clients.jedis.Jedis;
public class RedisLock {
private static final String LOCK_KEY = "redis_lock"; // 锁的键
private static final int LOCK_EXPIRE = 300; // 锁的过期时间,单位秒
private static final int ACQUIRE_TIMEOUT = 1000; // 获取锁的超时时间,单位毫秒
private Jedis jedis;
public RedisLock() {
jedis = new Jedis("localhost", 6379);
}
public boolean acquireLock() {
long end = System.currentTimeMillis() + ACQUIRE_TIMEOUT;
String identifier = String.valueOf(Thread.currentThread().getId());
while (System.currentTimeMillis() < end) {
if (jedis.setnx(LOCK_KEY, identifier) == 1) {
jedis.expire(LOCK_KEY, LOCK_EXPIRE);
return true;
}
if (jedis.ttl(LOCK_KEY) == -1) {
jedis.expire(LOCK_KEY, LOCK_EXPIRE);
}
try {
Thread.sleep(10);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
return false;
}
public void releaseLock() {
if (jedis.del(LOCK_KEY) == 0) {
// 解锁失败
}
}
}
```
以下是基于Zookeeper实现分布式锁的Java代码示例:
```java
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CountDownLatch;
public class ZookeeperLock {
private static final String LOCK_PATH = "/zookeeper_lock"; // 锁的路径
private static final int SESSION_TIMEOUT = 3000; // 会话超时时间,单位毫秒
private ZooKeeper zooKeeper;
private CountDownLatch connectedSignal = new CountDownLatch(1);
private String identifier;
public ZookeeperLock() {
try {
zooKeeper = new ZooKeeper("localhost:2181", SESSION_TIMEOUT, new Watcher() {
@Override
public void process(WatchedEvent event) {
if (event.getState() == Event.KeeperState.SyncConnected) {
connectedSignal.countDown();
}
}
});
connectedSignal.await();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
public boolean acquireLock() {
try {
identifier = String.valueOf(Thread.currentThread().getId());
String lockPath = zooKeeper.create(LOCK_PATH + "/lock_", identifier.getBytes(),
ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
List<String> children = zooKeeper.getChildren(LOCK_PATH, false);
Collections.sort(children);
if (lockPath.equals(LOCK_PATH + "/" + children.get(0))) {
return true;
} else {
String prevNodePath = LOCK_PATH + "/" + children.get(Collections.binarySearch(children, lockPath.substring(LOCK_PATH.length() + 1)) - 1);
Stat stat = zooKeeper.exists(prevNodePath, new Watcher() {
@Override
public void process(WatchedEvent event) {
if (event.getType() == Event.EventType.NodeDeleted) {
synchronized (this) {
notifyAll();
}
}
}
});
if (stat == null) {
return acquireLock();
} else {
synchronized (stat) {
stat.wait();
}
return acquireLock();
}
}
} catch (KeeperException | InterruptedException e) {
e.printStackTrace();
}
return false;
}
public void releaseLock() {
try {
zooKeeper.delete(LOCK_PATH + "/" + identifier, -1);
} catch (InterruptedException | KeeperException e) {
e.printStackTrace();
}
}
}
```
注意:以上代码仅供参考,实际使用时需要根据具体需求进行调整和完善。