redis分布式锁

模板:

/*** 分布式锁模板类* Created by sunyujia@aliyun.com on 2016/2/23.*/
public interface DistributedLockTemplate {/**** @param lockId 锁id(对应业务唯一ID)* @param timeout 单位毫秒* @param callback 回调函数* @return*/public Object execute(String lockId,int timeout,Callback callback);
}
public interface DistributedReentrantLock {public boolean tryLock(long timeout, TimeUnit unit) throws InterruptedException;public void unlock();
}

zk锁:

public class ZkDistributedLockTemplate implements DistributedLockTemplate {private static final org.slf4j.Logger log = LoggerFactory.getLogger(ZkDistributedLockTemplate.class);private CuratorFramework client;public ZkDistributedLockTemplate(CuratorFramework client) {this.client = client;}private boolean tryLock(ZkReentrantLock distributedReentrantLock,Long timeout) throws Exception {return distributedReentrantLock.tryLock(timeout, TimeUnit.MILLISECONDS);}@Overridepublic Object execute(String lockId, int timeout, Callback callback) {ZkReentrantLock distributedReentrantLock = null;boolean getLock=false;try {distributedReentrantLock = new ZkReentrantLock(client,lockId);if(tryLock(distributedReentrantLock,new Long(timeout))){getLock=true;return callback.onGetLock();}else{return callback.onTimeout();}}catch(InterruptedException ex){log.error(ex.getMessage(), ex);Thread.currentThread().interrupt();}catch (Exception e) {log.error(e.getMessage(), e);}finally {if(getLock){distributedReentrantLock.unlock();}}return null;}
}
/*** 基于Zookeeper的可重入互斥锁(关于重入:仅限于持有zk锁的jvm内重入)* Created by sunyujia@aliyun.com on 2016/2/24.*/
public class ZkReentrantLock implements DistributedReentrantLock {private static final org.slf4j.Logger log = LoggerFactory.getLogger(ZkReentrantLock.class);/*** 线程池*/private static final ScheduledExecutorService executorService = Executors.newScheduledThreadPool(10);/*** 所有PERSISTENT锁节点的根位置*/public static final String ROOT_PATH = "/ROOT_LOCK/";/*** 每次延迟清理PERSISTENT节点的时间  Unit:MILLISECONDS*/private long delayTimeForClean = 1000;/*** zk 共享锁实现*/private InterProcessMutex interProcessMutex = null;/*** 锁的ID,对应zk一个PERSISTENT节点,下挂EPHEMERAL节点.*/private String path;/*** zk的客户端*/private CuratorFramework client;public ZkReentrantLock(CuratorFramework client, String lockId) {init(client, lockId);}public void init(CuratorFramework client, String lockId) {this.client = client;this.path = ROOT_PATH + lockId;interProcessMutex = new InterProcessMutex(client, this.path);}@Overridepublic boolean tryLock(long timeout, TimeUnit unit) throws InterruptedException {try {return interProcessMutex.acquire(timeout, unit);} catch (InterruptedException e) {throw e;} catch (Exception e) {log.error(e.getMessage(),e);throw new RuntimeException(e.getMessage(),e);}}@Overridepublic void unlock() {try {interProcessMutex.release();} catch (Throwable e) {log.error(e.getMessage(), e);} finally {executorService.schedule(new Cleaner(client, path), delayTimeForClean, TimeUnit.MILLISECONDS);}}static class Cleaner implements Runnable {CuratorFramework client;String path;public Cleaner(CuratorFramework client, String path) {this.client = client;this.path = path;}@Overridepublic void run() {try {List list = client.getChildren().forPath(path);if (list == null || list.isEmpty()) {client.delete().forPath(path);}} catch (KeeperException.NoNodeException e1) {//nothing} catch (KeeperException.NotEmptyException e2) {//nothing} catch (Exception e) {log.error(e.getMessage(), e);//准备删除时,正好有线程创建锁}}}
}

zookeeper分布式锁代码实例相关推荐

  1. zookeeper分布式锁原理及实现

    前言 本文介绍下 zookeeper方式 实现分布式锁 原理简介 zookeeper实现分布式锁的原理就是多个节点同时在一个指定的节点下面创建临时会话顺序节点,谁创建的节点序号最小,谁就获得了锁,并且 ...

  2. 架构系列---利用zookeeper 分布式锁解决缓存重建冲突实战

    上一篇 分布式缓存重建并发冲突问题以及zookeeper分布式锁解决方案, 主要讲解了分布式缓存重建冲突原因及利用zookeeper分布式锁解决缓存重建冲突问题,本篇接着上篇,实现上篇思路,带你利用z ...

  3. zookeeper 分布式锁原理

    zookeeper 分布式锁原理: 1 大家也许都很熟悉了多个线程或者多个进程间的共享锁的实现方式了,但是在分布式场景中我们会面临多个Server之间的锁的问题,实现的复杂度比较高.利用基于googl ...

  4. 分布式锁(一) Zookeeper分布式锁

    什么是Zookeeper? Zookeeper(业界简称zk)是一种提供配置管理.分布式协同以及命名的中心化服务,这些提供的功能都是分布式系统中非常底层且必不可少的基本功能,但是如果自己实现这些功能而 ...

  5. Zookeeper分布式锁的使用

    由于公司引入了dubbo+zookeeper框架,里面不可避免的引入的zookeeper分布式锁,所以自己大致了解了一下.由于是自己研究,有不正确的地方还请大佬批评指正. 首先先介绍一下自己对zook ...

  6. Zookeeper分布式锁

    原文作者:阿凡卢 出处:http://www.cnblogs.com/luxiaoxun/ 原文连接:https://www.cnblogs.com/luxiaoxun/p/4889764.html ...

  7. Zookeeper分布式锁原理

    1.分布式锁介绍 单机应用开发,涉及并发同步的时候,我们往往采用synchronized 或者Lock的方式来解决多线程间的代码同步问题,这时多线程的运行都是在同一个JVM之下,没有任何问题. 但当我 ...

  8. Zookeeper 分布式锁

    Zookeeper 分布式锁 在分布式场景中,采用传统的锁并不能解决跨进程并发的问题,所以需要引入一个分布式锁,来解决多个节点之间的访问控制 一.Zookeeper如何解决分布式锁 基于Zookeep ...

  9. 关于分布式锁的面试题都在这里了|Reids分布式锁|ZooKeeper分布式锁

    我今天班儿都没上,就为了赶紧把这篇文章分布式锁早点写完.我真的不能再贴心了. 边喝茶边构思,你们可不要白嫖了! 三连来一遍? 引言 为什么要学习分布式锁? 最简单的理由就是作为一个社招程序员,面试的时 ...

最新文章

  1. Intellij IDEA 将工程转换成maven工程 详解
  2. 信息管理(Information Management)
  3. 安装acdsee 3.1后出错
  4. 英文金曲大赛_JAVA
  5. 神策数据斩获大数据星河奖,首发用户行为分析标准
  6. android adb server is out of date
  7. 【小菜日志】用C#完成Allen Lee's Magic大虾推荐的F#作业F#学习中
  8. Java黑皮书课后题第8章:8.29(相同的数组)如果两个二维数组m1和m2具有相同的内容,则它们是相同的。编写一个方法,如果m1和m2相同的话,返回true
  9. ABAP 代码中,哪些特殊字符不能用于变量命名?
  10. UE4学习-阶段性总结1
  11. 计算机机房安全设计规范,弱电机房建设规范要求
  12. 终极算法——第二章:终极算法
  13. python 字段_python字典查询
  14. Linux群控链接USB手机个数,群控系统能做到同时控制上百台手机吗?教你如何群控手机...
  15. 13款经典BI项目报表界面风格设计方案
  16. 计算机资源管理器经常停止运行,windows资源管理器已停止工作一直弹出来彻底解决方案...
  17. JSHOP2学习4:浅谈与SHOP2的区别
  18. HNU小学期实训课设
  19. 查看https 安全证书信息
  20. 【golang】golang使用cmd去ping网址在window和linux的区别

热门文章

  1. 对话系统(一)-概览
  2. oracle 数据库运维技术,Oracle数据库智能运维标准化工艺研究-orastar-DIY数据库运维工具-第1期 导论篇...
  3. Navicat mysql 加索引_mysql 索引 (Navicat添加索引)
  4. 服务器虚拟化架构设计,服务器虚拟化与数据中心I/O网络架构设计
  5. android编程读取sd卡txt文件,如何读取SD卡中的txt文件?
  6. 八十二、Python | Leetcode贪心算法系列
  7. 七十二、Springboot整合MyBatis(配置文件版)
  8. sklearn数据预处理
  9. 额外篇 | ggplot (下)
  10. 相较神经网络,大名鼎鼎的傅里叶变换,为何没有一统函数逼近器?