分布式锁--zookeeper实现

  1. zookeeper典型应用场景
  2. 数据发布订阅
  3. 命名服务
  4. Master选举
  5. 集群管理
  6. 分布式队列
  7. 分布式锁

 

用zookeeper实现分布式锁逻辑

特性:同父的子节点不可重名

所有的线程都连都同一个zookeeper上,创建同名的节点。并注册他的watcher监控

 

所以使用临时节点,因为持久节点可能发生死锁

下面的代码,有些异常,只是为了说明问题

package distributeLock;

import com.sun.javafx.css.CalculatedValue;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.RetryOneTime;

import java.util.Collection;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class DistributeLockZookeeper implements  Lock{

    private  String lockPath;

    private CuratorFramework zkClient ;

    public DistributeLockZookeeper(String lockPath, CuratorFramework zkClient) {
        this.lockPath = lockPath;
        this.zkClient = CuratorFrameworkFactory.newClient("127.0.0.1:2181", new RetryOneTime(1000));;
    }

    @Override
    public void lock() {
        if (!tryLock()){
            waitForLock();
            lock();//自己掉自己
        }
    }

    private void waitForLock() {
    }

    @Override
    public void lockInterruptibly() throws InterruptedException {

    }

    @Override
    public boolean tryLock() {//不会阻塞
        return false;
    }

    @Override
    public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
        try {
            zkClient.createContainers(lockPath);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    @Override
    public void unlock() {
        zkClient.delete();
    }

    @Override
    public Condition newCondition() {
        return null;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章