实现分布式锁是 ZooKeeper 的一个常见应用场景。下面是一个使用 ZooKeeper 实现分布式锁的简单示例,基于 curator
库。
示例代码假设你的项目中引入了 curator
依赖。注意,这个示例只是一个基本的演示,实际生产环境中还需要考虑更多的异常处理、超时控制、死锁处理等情况。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| import org.apache.curator.framework.CuratorFramework; import org.apache.curator.framework.CuratorFrameworkFactory; import org.apache.curator.framework.recipes.locks.InterProcessMutex; import org.apache.curator.retry.ExponentialBackoffRetry; import org.apache.curator.utils.CloseableUtils;
import java.util.concurrent.TimeUnit;
public class DistributedLock { private final CuratorFramework client; private final String lockPath; private final InterProcessMutex lock;
public DistributedLock(String connectString, String lockPath) { this.client = CuratorFrameworkFactory.newClient(connectString, new ExponentialBackoffRetry(1000, 3)); this.lockPath = lockPath; this.lock = new InterProcessMutex(client, lockPath); client.start(); }
public boolean acquireLock(long timeout, TimeUnit unit) { try { return lock.acquire(timeout, unit); } catch (Exception e) { e.printStackTrace(); return false; } }
public void releaseLock() { try { lock.release(); } catch (Exception e) { e.printStackTrace(); } }
public void close() { CloseableUtils.closeQuietly(client); }
public static void main(String[] args) { String connectString = "localhost:2181"; String lockPath = "/myApp/lock";
DistributedLock distributedLock = new DistributedLock(connectString, lockPath);
try { if (distributedLock.acquireLock(10, TimeUnit.SECONDS)) { System.out.println("Lock acquired. Doing critical section work..."); Thread.sleep(5000); } else { System.out.println("Failed to acquire lock."); } } catch (InterruptedException e) { e.printStackTrace(); } finally { distributedLock.releaseLock(); distributedLock.close(); } } }
|
在上述代码中,DistributedLock
类封装了分布式锁的基本功能。通过 acquireLock
方法尝试获取锁,在锁获取成功后进入临界区执行工作。releaseLock
方法用于释放锁。
需要注意的是,这只是一个基本的分布式锁实现示例。在实际应用中,你可能需要考虑更复杂的锁策略、超时控制、处理异常情况等。同时,ZooKeeper 还支持其他类型的分布式锁,如 InterProcessSemaphoreMutex
、InterProcessReadWriteLock
等,你可以根据需求选择合适的锁类型。