当前位置: 首页 > news >正文

韶关营销型网站建设网站建设设置背景图片

韶关营销型网站建设,网站建设设置背景图片,多少钱翻译英文,电子商务网站服务器前言 我之前写了一篇快速上手ZK的文章#xff1a;https://blog.csdn.net/qq_38974073/article/details/135293106 本篇最要是进一步加深学习ZK#xff0c;算是一次简单的实践#xff0c;巩固学习成果。 设计一个分布式锁 对锁的基本要求 可重入#xff1a;允许同一个应…前言 我之前写了一篇快速上手ZK的文章https://blog.csdn.net/qq_38974073/article/details/135293106 本篇最要是进一步加深学习ZK算是一次简单的实践巩固学习成果。 设计一个分布式锁 对锁的基本要求 可重入允许同一个应用内的同一个线程重复调用同一个方法阻塞没有拿到锁的线程将进入阻塞。公平的先来先得。 实现原理 使用zk作为发号器每个线程申请锁时会创建一个临时有序节点 节点编号最小的获得锁完成业务操作之后删除临时节点如果不是最小编号的节点就监听前一个节点的删除事件并进入阻塞状态当触发回调的事件时唤醒阻塞线程并重新进行获取锁操作。 锁要求实现的描述 可重入对同一个线程不用重复获取锁重入计数1即可阻塞利用CountDownLatch实现当触发回调时唤醒线程公平的利用zk临时有序节点的特点进行排队先到先申请锁。 问申请到锁之后网络中断怎么办 临时节点随客户端关闭而被删除 问如何避免羊群效应 每个线程只监听前一个节点 关键流程 关键代码实现 锁的关键方法 加锁lock解锁unLock尝试加锁tryLock public boolean lock() {if(Thread.currentThread().equals(thread)) {lockCount.incrementAndGet();return true;}while (true) {if (tryLock()) {thread Thread.currentThread();lockCount.incrementAndGet();return true;}try {await();} catch (Exception e) {throw new RuntimeException(e);}} }public synchronized boolean unlock() {if (!thread.equals(Thread.currentThread())) {return false;}int newLockCount lockCount.decrementAndGet();if (newLockCount 0) {throw new IllegalMonitorStateException(重入锁计数不可为负数 );}// 是否剩余重入次数if (newLockCount ! 0) {return true;}// 到这一步意味着lockCount已经为0可以删除临时节点了try{if(client.isNodeExist(properties.getZkPath())) {client.deleteNode(lockedPathMap.get(thread));}} catch (Exception e) {return false;} finally {lockedPathMap.remove(thread);priorPathMap.remove(thread);}return true; }protected boolean tryLock() {String lockedPath lockedPathMap.get(Thread.currentThread());if (null lockedPath || !client.isNodeExist(lockedPath)) {lockedPathMap.put(Thread.currentThread(), lockedPath client.createEphemeralSeqNode(getLockPrefix()));}// 取得加锁的排队编号String lockedShortPath getShorPath(lockedPath);ListString waiters getWaiters();// 如果自己是所有等待锁中的第一个则获得锁if (checkLocked(waiters, lockedShortPath)) {return true;}// 当前线程节点是否在排队int index Collections.binarySearch(waiters, lockedShortPath);if(index 0) {throw new NullPointerException(可能网络抖动连接断开临时节点失效);}// waiters最后面的节点写入map用来监听priorPathMap.put(Thread.currentThread(), getLockPrefix() waiters.get(index - 1));return false; }private boolean await() throws Exception {String priorPath priorPathMap.get(Thread.currentThread());if (null priorPath) {throw new NullPointerException(prior_path error);}final CountDownLatch latch new CountDownLatch(1);// 删除事件Watcher w watchedEvent - {// 监测到前一个节点发生变化接下来就可以唤起等待线程重新尝试获取锁latch.countDown();};try{// 监听前一个节点的删除时间client.watcher(w, priorPath);} catch (KeeperException.NoNodeException e) {e.printStackTrace();return false;}return latch.await(properties.getTimeout(), TimeUnit.MILLISECONDS); }好了如果你对这个感兴趣不妨拉一下完整源码 https://gitee.com/liangshij/zk-lock-demo 源码简要说明 模块说明 lsj-zk-lock核心实现。lsj-zk-lock-spring-boot-starter整合springbootlsj-zk-lock-test使用demo 安装 经典三步走导包、配置、使用 拉取代码将lsj-zk-lock、lsj-zk-lock-spring-boot-starter通过 mvn install 命令安装到本地仓库。引入依赖 dependencygroupIdcn.lsj/groupIdartifactIdlsj-zk-lock-spring-boot-starter/artifactIdversion2.4.2/version /dependency配置 配置locks和dataSource spring:zk:dataSource:url: localhostport: 2181locks:- zkPath: /test/locklockName: countLock# 获取锁失败时进入等待的时间等待结束将重新尝试获取锁timeout: 5000- zkPath: /test2/locklockName: locktimeout: 5000使用 使用方式1通过GlobalLock注解指定要使用那个lock GetMapping(test2) GlobalLock(countLock) public String test2() {// 业务代码return ; }使用方式2通过Qualifier注解指定要使用那个lock RestController public class TestController {int count 0;ResourceQualifier(lock)private ReentrantLock lock;ResourceQualifier(countLock)private ReentrantLock countLock;GetMapping(test)public String test() {countLock.lock();try{for (int i 0; i 10000; i) {count;}} finally {countLock.unlock();}return String.valueOf(count);} }
http://www.tj-hxxt.cn/news/227228.html

相关文章:

  • 布吉附近公司做网站建设多少钱wordpress从指定目录获取文章
  • 代码制作软件佛山优化网站方法
  • 营销型网站建设明细报价表东莞临时工最新招聘
  • 网站制作内容dns是不是做网站用的
  • 注册公司怎么注册啊东莞seo排名优化公司
  • 网站地图怎么做用云主机做网站
  • 网站热力图工具国际外贸平台排名
  • wordpress5.0大更新一键优化下载
  • 查询站长工具会给网站带来外链这样好吗荆州哪有做网站的公司
  • 郓城县城乡和建设局网站二级域名网站权重
  • 深圳网站建设哪个最好公司页面设计
  • 长沙网站建设制作网页版梦幻西游虎灯令
  • php开发网站流程担路网络科技有限公司的服务
  • 重庆网站建设价格页面运营
  • 网站建设维护费怎么说农业公司网站源码
  • 建设网站公司专业服务wordpress标签组合
  • 临沂网站建设技术托管公司人员管理系统
  • 免费生成网站的appwordpress安全设置
  • 厦门建网站怎样注册网站账号申请
  • 本手机原有微信网站o2o网站开发公司
  • 网站运营目标网站建设的渠道策略
  • 岳阳做网站公司标书制作培训机构
  • 网站备案名称修改手把手教建设网站
  • 建立一个个人网站静态化网站的缺点
  • 那些网站是php做的嵌入式软件开发技术
  • 设计网站哪个好用北京市建设监理协会官方网站
  • 如何设计的英文网站安阳手机网站制作
  • 网站付款链接怎么做的网站后台拿shell
  • 设计商城网站 优帮云企业数字展厅设成都企业展厅设计公司
  • 越南网站 后缀近期的新新闻