前面zookeeper系统文章主要讲了zookeeper的实现原理,对我们使用好zookeeper有好处。如何使用zookeeper,让我开始实践之旅。通过简单的实现,zookeeper可以很容易提供分布式锁服务。
互斥锁的实现
在zookeeper的源代码包中recipe下有一个lock实现的例子,大家可以看到一个writelock的实现。writelock相当于一个互斥锁,但要和java提供的lock相比,用起来还是不太一样,需要我们进行一下包装,以下是对writeLock包装后的实现:
public class JoeZKLock implements GlobalLock{
private static final Logger logger = Logger.getLogger(JoeZKLock.class);
final static private String NO_PATH = "no_path";
private WriteLock lock;
final private String lockPath;
final private ReentrantLock jvMLock = new ReentrantLock();
public JoeZKLock(ZooKeeper zk, String lockPath) throws IOException {
this.lockPath = lockPath;
lock = new WriteLock(zk, lockPath, null);
}
public String lock() throws InterruptedException {
jvMLock.lock();
try {
while (true) {
if (lock.lock()) {
return NO_PATH;
}
}
} catch (Throwable e) {
// here need catch Throwable, avoid throw
// runtimeException
// cause the jvmLock unrealsed
logger.error("accquire global lock " + lockPath + " fail.", e);
jvMLock.unlock();
throw new InterruptedException();
}
}
public void unlock(String path) {
try {
lock.unlock();
} finally {
//here ensure release the jvm lock
jvMLock.unlock();
}
}
}
为什么需要在分布式锁的基础上再套一个jvmLock呢?主要原因是如果是同一个jvm的多个线程想要获取锁,如果在本地就互斥,就先在本地排队,这可以避免在zookeeper的锁节点产生大量的孩子,因为在锁实现的代码中需要getChildren,如果孩子越多,性能也越差。
读写锁的实现也大同小异。在此不在一一赘述。
在我们具体的lock server实现中提供了4种锁:
1.互斥锁
2.读写锁
3.path锁
4.id锁
通过这4种锁,完全能满足绝大多数锁的应用场景。
分享到:
相关推荐
分布式服务框架 Zookeeper -- 管理分布式环境中的数据
ZooKeeper-分布式过程协同技术详解ZooKeeper-分布式过程协同技术详解ZooKeeper-分布式过程协同技术详解ZooKeeper-分布式过程协同技术详解
从Paxos到Zookeeper分布式一致性原理与实践 + ZooKeeper-分布式过程协同技术详解
springboot redis zookeeperlock rabbit实现的分布式锁 代码
ZooKeeper-分布式过程协同技术详解 和 从Paxos到Zookeeper 分布式一致性原理与实践 电子书。喜欢请支持种作者。购买纸质版
hadoop-2.8.1 zookeeper-3.4.9 hbase-1.3.1分布式环境搭建整理
ZooKeeper-分布式过程协同技术详解-最新版 亲自测试高清文字版
ZooKeeper-分布式过程协同技术详解(高清)
ZooKeeper-分布式过程协同技术详解
springboot redis zookeeperlock rabbit实现的分布式锁.zip
ZooKeeper-分布式过程协同技术详解 高清完整版PDF
zookeeper做分布式锁
ZooKeeper-分布式过程协同技术详解.pdf
zooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是集群的管理者。提供了文件系统和通知机制。 在开发项目的过程中,很多大型项目都是分布式部署的,那么我们现在使用zookeeper实现一个分布式锁。
基于zookeeper的分布式锁简单实现,包含测试代码,实用工具类