前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >zookeeper实现分布式锁 顶

zookeeper实现分布式锁 顶

作者头像
算法之名
发布2019-08-20 11:11:01
3030
发布2019-08-20 11:11:01
举报
文章被收录于专栏:算法之名

神马是分布式锁呢,就是利用服务器集群的特性,如zookeeper或者mysql,redis对多台分布式服务器的进程进行只允许一台服务器的一个进程来进行一个同步操作的过程,其他任务服务器的进程只能等待,进行自旋。

用zookeeper锁,我们用到的zookeeper客户端的一个依赖。

代码语言:javascript
复制
<dependency>
   <groupId>org.apache.curator</groupId>
   <artifactId>curator-framework</artifactId>
   <version>2.9.0</version>
</dependency>
<dependency>
   <groupId>org.apache.curator</groupId>
   <artifactId>curator-recipes</artifactId>
   <version>2.9.0</version>
</dependency>
代码语言:javascript
复制
public interface OrderService {
    public String getOrderNo();
}

这里依然已订单编号为例,一个订单编号的接口。

代码语言:javascript
复制
public class OrderLockServiceImpl implements OrderService {
    static int num = 0;
    @Override
    public String getOrderNo() {
        SimpleDateFormat date = new SimpleDateFormat("YYYYMMDDHHMMSS");
        return date.format(new Date()) + num++;
    }
}

实现这个接口,不过这里跟JVM锁不同,不需要加同步标记,如synchronized或者其他可重入锁之类的。

代码语言:javascript
复制
public class OrderTask2 implements Runnable{
    private CountDownLatch latch;
    private OrderService orderService;
    private InterProcessLock lock;
    public OrderTask2(CountDownLatch latch,OrderService orderService,InterProcessLock lock) {
        this.latch = latch;
        this.orderService = orderService;
        this.lock = lock;
    }

    @Override
    public void run() {
        try {
            latch.await();
            lock.acquire();
            System.out.printf("类名%s订单号:%s\n",orderService.getClass().getName(), orderService.getOrderNo());
            lock.release();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

实现一个线程类,InterProcessLock为zookeeper的分布式锁接口。

代码语言:javascript
复制
final static CuratorFramework client = CuratorFrameworkFactory.builder().connectString("XXX.XXX.XXX.XXX:2181,XXX.XXX.XXX.XXX:2181,XXX.XXX.XXX.XXX:2181").retryPolicy(new ExponentialBackoffRetry(100,1)).build();
public static void main(String[] args) {
    client.start();
    ExecutorService service = Executors.newCachedThreadPool();
    InterProcessMutex lock = new InterProcessMutex(client,"/bit");
    final CountDownLatch latch = new CountDownLatch(1);
    for (int i = 0;i < 10;i++) {
        service.submit(new OrderTask2(latch,new OrderLockServiceImpl(),lock));
    }
    latch.countDown();
    service.shutdown();
}

其中"XXX.XXX.XXX.XXX:2181,XXX.XXX.XXX.XXX:2181,XXX.XXX.XXX.XXX:2181"为zookeeper集群

运行结果

类名com.guanjian.until.OrderLockServiceImpl订单号:2018071962207960 类名com.guanjian.until.OrderLockServiceImpl订单号:20180719622073001 类名com.guanjian.until.OrderLockServiceImpl订单号:20180719622073392 类名com.guanjian.until.OrderLockServiceImpl订单号:20180719622074033 类名com.guanjian.until.OrderLockServiceImpl订单号:20180719622074594 类名com.guanjian.until.OrderLockServiceImpl订单号:20180719622075505 类名com.guanjian.until.OrderLockServiceImpl订单号:20180719622076026 类名com.guanjian.until.OrderLockServiceImpl订单号:20180719622076507 类名com.guanjian.until.OrderLockServiceImpl订单号:20180719622076998 类名com.guanjian.until.OrderLockServiceImpl订单号:20180719622077639

进入zookeeper,我们可以看到/bit目录已经创建

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档