package Lock;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;

import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.ZkClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class DistributeLock implements Lock{
private static Logger LOG = LoggerFactory.getLogger(DistributeLock.class);
private static String ZK_IP_PORT= "192.168.0.137:2181";
private static String LOCK_NODE = "/lock";

private ZkClient client = new ZkClient(ZK_IP_PORT);
private CountDownLatch cdl = null;

@Override
public void lock() {
if(tryLock()){
return ;
}
waitForLock();
lock();
}

private void waitForLock(){
IZkDataListener listener = new IZkDataListener() {

@Override
public void handleDataDeleted(String dataPath) throws Exception {
// TODO Auto-generated method stub

}

@Override
public void handleDataChange(String dataPath, Object data) throws Exception {
if(cdl != null){
cdl.countDown();
}
}
};

client.subscribeDataChanges(LOCK_NODE, listener);
if(client.exists(LOCK_NODE)){
if(cdl != null){
cdl = new CountDownLatch(1);
try {
cdl.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
client.unsubscribeDataChanges(LOCK_NODE, listener);
}

@Override
public void lockInterruptibly() throws InterruptedException {

}

@Override
public boolean tryLock() {
try {
client.createEphemeral(LOCK_NODE);
LOG.info("获取到锁");
return true;
} catch (Exception e) {
}
LOG.error("获取失败");
return false;
}

@Override
public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
return false;
}

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

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

}

测试类:

package Lock;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.CountDownLatch;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LockTest {
private static Logger LOG = LoggerFactory.getLogger(LockTest.class);
private static int count = 10;
private static CountDownLatch cdl = new CountDownLatch(count);
public static void main(String[] args) {
for(int i = 0; i < count;i++){
new Thread(new Order()).start();
LOG.error("开启");
cdl.countDown();
}
}

static class Order implements Runnable{
private DistributeLock lock = new DistributeLock();
@Override
public void run() {
try {
cdl.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
lock.lock();
String orderId = GenorderId.genOrderId();

System.out.println(orderId);
lock.unlock();
}

}

static class GenorderId{
private static int index = 0;
public static String genOrderId(){
SimpleDateFormat sdf = new SimpleDateFormat("yyyymmddhhmmss|SSS");
return sdf.format(new Date()) + ++index;
}
}

}

最新文章

  1. tomcat下bin文件夹下shell文件分析
  2. Linq之Expression高级篇(常用表达式类型)
  3. C#生成JSON数据
  4. sql中的字符串匹配、函数大全
  5. Android计时器TimerTask,Timer,Handler
  6. zedboard 驱动理解
  7. 测试RegExp对象的属性
  8. uva 825 - Walking on the Safe Side(dp)
  9. vbscript语句
  10. BotVS开发基础—2.3 下市价单 交易
  11. 201521123119《Java程序设计》第10周学习总结
  12. php+jQuery+Mysql找回密码----ThinkPHP
  13. 初学Python——面向对象(二)
  14. Android——AsyncTask
  15. MyBatis时间比较
  16. 6.简单提取小红书app数据保存txt-2
  17. Transition学习笔记
  18. 【css系列】创建网页加载进度条
  19. Redis演示及使用场景
  20. ZooKeeper与Kafka相关

热门文章

  1. PHP:第五章——字符串编码函数
  2. MongoDB驱动程序快速入门
  3. 非关联容器|hash|unordered_map/multimap,unordered_set/multiset
  4. 流程设计器jQuery + svg/vml(Demo3 - 添加流程结点)
  5. java基础第10天
  6. 第十一次作业 - Alpha 事后诸葛亮
  7. 设计模式(Python)-观察者模式
  8. NYOJ-1036 非洲小孩
  9. Android 基础题目
  10. PYTHON 常用API ***