- zookeeper典型應用場景
- 數據發佈訂閱
- 命名服務
- Master選舉
- 集羣管理
- 分佈式隊列
- 分佈式鎖
用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;
}
}