zookeeper怎么实现分布式锁

 我来答
huanglenzhi
2016-03-13 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
采纳数:117538 获赞数:517193
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。

向TA提问 私信TA
展开全部

这种实现非常简单,具体的流程如下


 对应的实现如下

Java代码  

package zk.lock;  

  

  

import zk.util.NetworkUtil;  

import zk.util.ZKUtil;  

  

/** 

 * User: zhenghui 

 * Date: 14-3-26 

 * Time: 下午8:37 

 * 分布式锁实现. 

 * 

 * 这种实现的原理是,创建某一个任务的节点,比如 /lock/tasckname 然后获取对应的值,如果是当前的Ip,那么获得锁,如果不是,则没获得 

 * .如果该节点不存在,则创建该节点,并把改节点的值设置成当前的IP 

 */  

public class DistributedLock01 {  

  

    private ZKClient zkClient;  

  

  

    public static final String LOCK_ROOT = "/lock";  

    private String lockName;  

  

  

    public DistributedLock01(String connectString, int sessionTimeout,String lockName) throws Exception {  

        //先创建zk链接.  

        this.createConnection(connectString,sessionTimeout);  

  

        this.lockName = lockName;  

    }  

  

    public boolean tryLock(){  

        String path = ZKUtil.contact(LOCK_ROOT,lockName);  

        String localIp = NetworkUtil.getNetworkAddress();  

        try {  

            if(zkClient.exists(path)){  

                String ownnerIp = zkClient.getData(path);  

                if(localIp.equals(ownnerIp)){  

                    return true;  

                }  

            } else {  

                zkClient.createPathIfAbsent(path,false);  

                if(zkClient.exists(path)){  

                    String ownnerIp = zkClient.getData(path);  

                    if(localIp.equals(ownnerIp)){  

                        return true;  

                    }  

                }  

            }  

        } catch (Exception e) {  

            e.printStackTrace();  

        }  

        return false;  

    }  

  

  

    /** 

     * 创建zk连接 

     * 

     */  

    protected void createConnection(String connectString, int sessionTimeout) throws Exception {  

        if(zkClient != null){  

            releaseConnection();  

        }  

        zkClient = new ZKClient(connectString,sessionTimeout);  

        zkClient.createPathIfAbsent(LOCK_ROOT,true);  

    }  

    /** 

     * 关闭ZK连接 

     */  

    protected void releaseConnection() throws InterruptedException {  

        if (zkClient != null) {  

            zkClient.close();  

        }  

    }  

  

}  

year医海无边
2017-01-29 · TA获得超过1.5万个赞
知道小有建树答主
回答量:9169
采纳率:66%
帮助的人:1127万
展开全部
很多使用Zookeeper的情景是需要我们嵌入Zookeeper作为自己的分布式应用系统的一部分来提供分布式服务,此时我们需要通过程序的方式来启动Zookeeper。此时可以通过Zookeeper API的ZooKeeperServerMain类来启动Zookeeper服务。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式