• zk分布式锁-排它锁简单实现


    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;
    }
    }

    }

  • 相关阅读:
    枚举求解,也叫暴力破解
    多线程之线程的中止
    beginners with the Multithreading programming
    EditBox control Update Problem (A CString type EditBox control in a loop cannot be updated immidiately)
    有关多线程的一些技术问题
    多线程编程基础知识
    VC的若干实用小技巧 (如何干净的删除一个类)
    进入MFC讲坛的前 (Window 程序详细分析)
    Multithreading using MFC in Plain English: Part I
    关于在VS2005环境下无法从源视图切换到设计视图的解决方案
  • 原文地址:https://www.cnblogs.com/maohuidong/p/8433408.html
Copyright © 2020-2023  润新知