分佈式鎖--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;
    }
}

 

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