基于官方zookeeper的分布式锁实例的改动

有兴趣可以了解下这款国内人气很旺的JAVA代码生成器基于拖拽,不用写复杂的模板,支持多种数据库,适配wap,管理后台各种功能全有 免费开源 地址:https://blog.csdn.net/adyuebanwan/article/details/83006405 或者 http://www.magicalcoder.com

=======================================================================================

最近学习zookeeper,知道zookeeper可以实现分布式锁,具体算法就不赘述了,

把zookeeper官方提供的lock实例下载下来 ,发现 运行后的结果并不是自己想要的那样

 

我需要的场景:多台服务器 竞争锁,当没有得到锁的时候,会一直去请求锁,如果一台机器得到锁,那么在他没有释放锁之前,其他服务器无法获取锁

 

对源码进行了一小部分的改动 讲给懂得人听

1 测试类 Test

 

public static void main(String[] args) {
        for(int i=1;i<=4;i++){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        ZooKeeper zk = new ZooKeeper(Constant.SERVERLIST,5000 , new Watcher() {
                            @Override
                            //当对目录节点监控状态打开时,一旦目录节点的状态发生变化,Watcher 对象的 process 方法就会被调用。
                            public void process(WatchedEvent event) {
                                System.out.println("触发 event :"+ event.getType() );
                            }
                        });
                        WriteLock writeLock = new WriteLock(zk,"/lock/PROJECT1",null);
                        //尝试获取锁
                        if(writeLock.getLockUntilGetOne()){
                            System.out.println(zk.getSessionId()+"我获得了锁");
                            writeLock.unlock();
                            System.out.println(zk.getSessionId()+"我释放了锁");
                        }
                        zk.close();//一定要关闭zookeeper
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    }


2 ZNodeName 改动

 

 

public int compareTo(ZNodeName that) {
    //FIFO 先到先得策略
    //因为sequence是递增的,必须比较它,而不是比较prefix  prefix只是字符串,必须保证后面递增的要大于先前创建过的节点
        int s1 = this.sequence;
        int s2 = that.sequence;
        return s1 == -1 ? 1 : s2 == -1 ? -1 : s1 - s2;
        /*
        //老的逻辑 不对无法保证锁全局唯一
        int answer = this.prefix.compareTo(that.prefix);
        if (answer == 0) {
            int s1 = this.sequence;
            int s2 = that.sequence;
            if (s1 == -1 && s2 == -1) {
                return this.name.compareTo(that.name);
            }
            answer = s1 == -1 ? 1 : s2 == -1 ? -1 : s1 - s2;
        }
        return answer;*/
    }


3 WriteLock

 

  

    private class LockWatcher implements Watcher {
        public void process(WatchedEvent event) {
            // lets either become the leader or watch the new/updated node
            LOG.debug("Watcher fired on path: " + event.getPath() + " state: " +
                    event.getState() + " type " + event.getType());
            try {
                //这里就是循环获取锁 下面的lock没必要
                // lock();
            } catch (Exception e) {
                LOG.warn("Failed to acquire lock: " + e, e);
            }
        }
    }

 

 

 

</pre><pre>

 

    提供一个新方法

 

    /**
     * 循环获取锁 直到获取1个锁为止
     * @return
     * @throws KeeperException
     * @throws InterruptedException
     */
    public boolean getLockUntilGetOne() throws KeeperException, InterruptedException {
        while (!lock()){}
        return true;
    }

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值