`
y806839048
  • 浏览: 1107974 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

zookeeper的两种分布式锁的源代码点评

阅读更多

zookeeper的两种分布式锁的源代码点评

 

自己实现锁的思想就是

 

所有分布式不好关的东西可以都注册到一个功能的中间件上,然后这个中间件进行统一汇集管理

 

对需要锁控制先后的线程先在执行前先建立一个标记性的节点,最后根据节点的顺序,决定线程执行的先后顺序(都在同一个zk上)

 

这也是zk的分布式锁原理

 

 

zk锁的源码(时序锁)

 

每个进程连接好zk之后就安照先后顺序创建节点,然后判断该节点是不是最先序列(最先创建),是的话就先执行,其他节点在其各自等待的节点(比自己小1的节点建立监听

,一旦自己监听的节点移除(锁释放),就会回调自己的process方法,自己多要做的事情(这时不在需要再获得锁,笫一次都依次建立好了时序锁))

 

 public void connectZookeeper() throws Exception {

        zk = new ZooKeeper(hosts, SESSION_TIMEOUT, new Watcher() {

            public void process(WatchedEvent event) {

                try {

                    // 连接建立时, 打开latch, 唤醒wait在该latch上的线程

                    if (event.getState() == KeeperState.SyncConnected) {

                        latch.countDown();////保证连接好了才往下走(倒计时为0开始执行)

 

                    }

 

                    // 发生了waitPath的删除事件

                    if (event.getType() == EventType.NodeDeleted && event.getPath().equals(waitPath)) {

                        doSomething();

                    }

                } catch (Exception e) {

                    e.printStackTrace();

                }

            }

        });

 

        // 等待连接建立

        latch.await();////保证连接好了才往下走

 

 

 

 

 

采用回调的方式实现所有锁依次执行

 // 在waitPath上注册监听器, 当waitPath被删除时, zookeeper会回调监听器的process方法

                zk.getData(waitPath, true, new Stat());

 

 

当很多进程需要访问共享资源时,我们可以通过zk来实现分布式锁。主要步骤是: 

1.建立一个节点,假如名为:lock 。节点类型为持久节点(PERSISTENT) 

2.每当进程需要访问共享资源时,会调用分布式锁的lock()或tryLock()方法获得锁,这个时候会在第一步创建的lock节点下建立相应的顺序子节点,节点类型为临时顺序节点(EPHEMERAL_SEQUENTIAL),通过组成特定的名字name+lock+顺序号。 

3.在建立子节点后,对lock下面的所有以name开头的子节点进行排序,判断刚刚建立的子节点顺序号是否是最小的节点,假如是最小节点,则获得该锁对资源进行访问。 

4.假如不是该节点,就获得该节点的上一顺序节点,并给该节点是否存在注册监听事件。同时在这里阻塞。等待监听事件的发生,获得锁控制权。 

5.当调用完共享资源后,调用unlock()方法,关闭zk,进而可以引发监听事件,释放该锁。 

实现的分布式锁是严格的按照顺序访问的并发锁。

 

 

http://blog.csdn.net/a925907195/article/details/39639357

 

 

 

独占锁

 

都去创建一个同名锁,用好了后删除,之前为创建成功的开始有创建,未得到的等待(先判断自己是不是最小的),等待超时会包超时异常,但是会不断的迭代直到获得锁

 

 

  

 

 

 

 

 

 

 

private boolean waitForLock(String lower, long waitTime, TimeUnit unit,boolean isBreak) throws InterruptedException, KeeperException {  

        long beginTime = System.currentTimeMillis();  

        Stat stat = zk.exists(root + "/" + lower,true);  

        //判断比自己小一个数的节点是否存在,如果不存在则无需等待锁,同时注册监听  

        if(stat != null){  

            logger.debug("Thread " + Thread.currentThread().getId() + " waiting for " + root + "/" + lower);  

            this.latch = new CountDownLatch(1);  

            this.latch.await(waitTime, unit);  

            if(this.latch.getCount() == 1){  

                 this.latch = null;  

                 if(isBreak){  

                     throw new LockException("申请锁资源默认时间是:"+defaultWaitTime+"ms,等待锁超时");  

                 }else{  

                     return false;  

                 }  

            }  

            this.latch = null;  

        }  

          

        //取出所有lockName的锁  

        List<String> lockObjNodes = this.getChildrenListSort();  

        logger.debug(myZnode + "==" + lockObjNodes.get(0));  

        if(myZnode.equals(root+"/"+lockObjNodes.get(0))){  

            //如果是最小的节点,则表示取得锁  

            return true;  

        }else{  

             //如果不是最小的节点,找到比自己小1的节点  

            String subMyZnode = myZnode.substring(myZnode.lastIndexOf("/") + 1);  

            waitNode = lockObjNodes.get(Collections.binarySearch(lockObjNodes, subMyZnode) - 1);  

            long endTime = System.currentTimeMillis();  

            waitTime = waitTime - (endTime - beginTime) ;  

            if(waitTime <= 0) return false;  

            return waitForLock(lower, waitTime, unit, false);//等待锁  (迭代)

        }  

    }

 

 

 

 

http://blog.csdn.net/qq_18167901/article/details/50681429

 

分享到:
评论

相关推荐

    zookeeper分布式锁实例源码

    通过分析和理解这些源代码,你可以更好地掌握如何在实际项目中利用ZooKeeper实现高效、可靠的分布式锁机制。 在实践中,ZooKeeper的分布式锁解决方案需要考虑的方面还包括异常处理(如网络分区)、锁的超时机制、...

    Redids和Zookepeer分布式锁实现源代码

    本文将深入探讨Redis和ZooKeeper这两种流行的分布式系统中的分布式锁实现。 **Redis分布式锁** Redis是一个高性能的键值存储系统,广泛用于缓存、消息队列等场景。在Redis中实现分布式锁主要依赖于两个命令:`...

    分布式集群dubbo+zookeeper.pdf

    集群和分布式是两种常见的分布式系统形态。 集群是指将同一业务逻辑部署在多台服务器上,这些服务器运行相同的代码,共同处理请求,以分散负载并提供高可用性。当一台服务器出现故障时,其他服务器仍能继续提供服务...

    分布式锁与信号量.zip

    "分布式锁"和"信号量"就是两种常用于管理并发访问的机制,它们在Java等编程语言中有着广泛的应用。这里我们将深入探讨这两个概念以及它们在实际项目中的应用。 首先,我们来看“分布式锁”。分布式锁是一种在分布式...

    基于SpringBoot+Zookeeper+Dubbo打造分布式高并发商品秒杀系统.zip

    本项目提供了完整的源代码,适合学习和实践分布式系统的设计与实现。通过下载并运行项目,开发者可以深入理解SpringBoot、Zookeeper和Dubbo在实际项目中的应用,以及如何应对高并发秒杀场景的挑战。无论是作为毕业...

    Spring Task+Zookeeper分布式定时任务调度组件-Taroco-Scheduler.zip

    Spring Task和Zookeeper是两种在分布式环境中常用于任务调度的技术。Spring Task是Spring框架的一部分,提供了在Java应用程序中实现定时任务的能力,而Zookeeper则是一个分布式协调服务,常被用作分布式系统的配置...

    0822分布式协调服务-zookeeper1

    Zookeeper是一种分布式协调服务,其设计目的是为了简化分布式环境下的数据管理和一致性问题。Zookeeper采用了一种名为ZAB(Zookeeper Atomic Broadcast)的协议,它是在Paxos算法的基础上进行优化,专为解决分布式...

    Zookeeper-release-3.5.4 源码,部分有注释

    这个“Zookeeper-release-3.5.4”压缩包包含了Zookeeper 3.5.4版本的源代码,对于Java开发者,尤其是对分布式系统感兴趣的工程师来说,这是一个宝贵的资源。它不仅可以帮助我们理解Zookeeper的内部工作原理,还可以...

    zookeeper工具

    开发者可以通过阅读源代码了解其实现细节,或者直接使用预编译的二进制文件在自己的分布式系统中部署ZooKeeper。对于学习和使用ZooKeeper的人来说,这是一个非常有价值的资源。通过深入理解ZooKeeper的工作原理和...

    Redis实现分布式锁和等待序列的方法示例

    然而,`SET`命令的非阻塞特性意味着如果获取锁失败,需要应用自行处理失败的线程,通常有两种策略: 1. **丢弃等待重试**:当获取锁失败时,放弃当前请求,稍后重新尝试获取。 2. **等待序列**:将未获取到锁的线程...

    zookeeper-api基础.zip

    《Zookeeper API基础》 Zookeeper是一个分布式协调服务,它为分布式应用提供一致性服务,包括命名服务、配置管理、集群...对于源代码的学习,可以帮助开发者深入理解Zookeeper内部的工作原理,提升开发和调优能力。

    zookeeper-3.8.0安装包下载

    Znode 是 Zookeeper 数据存储的基本单位,类似于文件系统中的节点,分为临时节点和永久节点两种。会话是客户端与 Zookeeper 服务器之间的一次交互过程,如果服务器与客户端的连接断开,临时节点将被自动删除。...

    zookeeper-3.4.8解压即用

    - `src/`:源代码目录,如果你需要查看或编译源代码,可以从这里开始。 - `docs/`:文档目录,可能包含用户指南、API参考和其他文档。 - `LICENSE`和`NOTICE`文件:包含软件的许可信息和版权声明。 总结来说,...

    zookeeper+rmi开发

    在IT行业中,ZooKeeper和RMI(Remote Method Invocation)是两种重要的技术,它们在分布式系统和企业级应用中有着广泛的应用。ZooKeeper是由Apache软件基金会开发的一个开源项目,主要用于分布式协调服务,而RMI是...

    zookeeper+redis打包jar

    Zookeeper是由Apache Hadoop项目开发的一个分布式协调服务,它提供了一种集中式的服务,用于配置管理、命名服务、分布式同步和组服务。Zookeeper的核心概念包括节点(Znode)、会话(Session)和Watcher等,它的设计...

    秒杀代码-distributed-lock-seckill.zip

    这个名为“distributed-lock-seckill.zip”的压缩包很可能包含了实现这种秒杀场景的Java源代码,旨在演示如何利用分布式锁来解决秒杀过程中的问题。 首先,我们需要理解分布式锁的概念。分布式锁是在分布式系统中,...

    zookeeper删除数据节点.rar_hello7gq_somethingjtt_spiderlxd_zk删除节点_zooke

    这些可能是与Zookeeper相关的文档、源代码或者工具,可能包含了实现递归删除功能的具体代码或指南。例如,"Zookeeperc"可能是一个C语言编写的Zookeeper客户端,提供了包括删除操作在内的API接口。而"Zookeeper"可能...

    jmqtt:基于Netty和Zookeeper的分布式MQTT代理

    在压缩包文件名称"jmqtt-master"中,"master"通常指的是项目的主分支或主版本,这表明你可能获得了该项目的最新稳定源代码。如果你打算深入研究或贡献代码,你可以解压这个文件,使用Java IDE导入项目,然后根据项目...

    Dubbo源代码(2.5.4)

    8. **配置管理**:Dubbo支持通过XML和注解两种方式进行配置,源代码中可以学习到如何通过`dubbo.properties`和XML配置文件来配置服务。 通过深入研究Dubbo的源代码,开发者不仅可以学习到分布式服务治理的最佳实践...

    Hadoop源代码分析完整版

    Hadoop作为分布式计算领域的核心框架,其源代码分析对于深入理解云计算的底层实现至关重要。Hadoop最初的设计灵感来源于Google的一系列论文,包括Google Cluster、Chubby、GFS、BigTable以及MapReduce。这些论文详细...

Global site tag (gtag.js) - Google Analytics