我可以使用zookeeper和create()来实现锁吗?
例如。
acquire() {
while(1) {
zk.create(lockPath, new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
if (lockPath already exists) {
Stat stat = zk.exists(lockPath, this);
if (stat != null) {
this.wait();
}
} else {
return true;
}
}
}
release() {
zk.delete(lockPath, -1)
}
字符串
对不对?
如果是,那么使用序列和短暂子节点的官方实现有什么优势呢?
1条答案
按热度按时间cyvaqqii1#
什么会触发
this.wait()
发布?除此之外,所提供的解决方案具有几个缺点:在Zookeeper的网站上有一个食谱:
希望获得锁的客户端执行以下操作:
1.使用路径名“locknode/lock-”调用create(),并设置序列和临时标志。
1.在锁节点上调用getChildren(),而不设置监视标志(这对于避免羊群效应很重要)。
1.如果在步骤1中创建的路径名具有最低的序列号后缀,则客户端具有锁并且客户端退出协议。
1.客户端调用exists(),并在锁目录中具有下一个最低序列号的路径上设置监视标志。
1.如果exists()返回false,则转到步骤2。否则,在转到步骤2之前,等待上一步骤中的路径名通知。
解锁协议非常简单:希望释放锁的客户端简单地删除它们在步骤1中创建的节点。
另外,我强烈推荐Apache Curator--一个在Zookeeper之上广泛使用的库,它实现了很多方法,包括不同种类的锁