中文在线免费看视频_国产成人精品亚洲日本在线观看_亚洲精品第一综合99久久_国产亚洲精品日韩综合网

當(dāng)前位置: 首頁 / 技術(shù)干貨 / 正文
分布式鎖的實(shí)現(xiàn)(二)

2023-01-12

   節(jié)點(diǎn)

  4.4. 子節(jié)點(diǎn)實(shí)現(xiàn)的鎖

  在生產(chǎn)環(huán)境中,使用子節(jié)點(diǎn)做分布式鎖的實(shí)現(xiàn)的場景是最常見的,包括阻塞型的鎖和非阻塞型的鎖。因此,設(shè)計(jì)子節(jié)點(diǎn)實(shí)現(xiàn)的鎖的父類,提供公共的處理邏輯。將阻塞型和非阻塞型的實(shí)現(xiàn)不同的邏輯分別在子類中實(shí)現(xiàn)即可。

  package com.qianfeng.lock.childNodeLock;

  import com.qianfeng.lock.ZkLocker;

  import com.qianfeng.lock.ZkLockerBase;

  import org.apache.zookeeper.CreateMode;

  import org.apache.zookeeper.KeeperException;

  import java.util.Collections;

  import java.util.List;

  /**

  * @author 千鋒大數(shù)據(jù)教研院 - 章魚哥

  * @company 北京千鋒互聯(lián)科技有限公司

  */

  public abstract class ZkChildNodeLockerBase extends ZkLockerBase implements ZkLocker {

  /**

  * 創(chuàng)建的子節(jié)點(diǎn)鎖的全路徑

  */

  protected String nodeFullPath;

  public ZkChildNodeLockerBase(String connectString, String lockName) {

  super(connectString, lockName);

  createLockNode();

  }

  public ZkChildNodeLockerBase(String lockName) {

  super();

  this.lockName = lockName;

  createLockNode();

  }

  // 創(chuàng)建鎖節(jié)點(diǎn)

  public void createLockNode() {

  // 1. 判斷節(jié)點(diǎn)是否存在

  if (!exists(getLockName())) {

  // 3. 創(chuàng)建鎖節(jié)點(diǎn)

  createNode(getLockName(), CreateMode.CONTAINER);

  }

  }

  @Override

  public boolean lock() {

  // 1. 在鎖節(jié)點(diǎn)下創(chuàng)建子節(jié)點(diǎn)

  this.nodeFullPath = createNode(getLockName() + "/child-", CreateMode.EPHEMERAL_SEQUENTIAL);

  // 2. 判斷是否可以成功上鎖

  return canLock();

  }

  @Override

  public boolean unlock() {

  return deleteNode(this.nodeFullPath);

  }

  @Override

  public boolean exists() {

  // 獲取當(dāng)前鎖節(jié)點(diǎn)下的子節(jié)點(diǎn)數(shù)量,如果大于0,說明有鎖存在

  try {

  Listchildren = getZkCli().getChildren(getLockName(), false);

  return children.size() > 0;

  } catch (KeeperException | InterruptedException ignored) {

  }

  return false;

  }

  protected abstract boolean canLock();

  /**

  * 獲取當(dāng)前創(chuàng)建的子節(jié)點(diǎn)之前的節(jié)點(diǎn)(根據(jù)序號(hào))

  * @return 之前的節(jié)點(diǎn)

  */

  protected String getPreviousNode() {

  // 定義變量,記錄上一個(gè)節(jié)點(diǎn)名稱

  String previousNodeName = null;

  try {

  // 1. 獲取鎖節(jié)點(diǎn)下所有的子節(jié)點(diǎn)

  Listchildren = getZkCli().getChildren(getLockName(), false);

  // 2. 對(duì)所有的節(jié)點(diǎn)進(jìn)行名字排序

  Collections.sort(children);

  // 3. 獲取當(dāng)前創(chuàng)建的子節(jié)點(diǎn)名稱

  String childNodeName = this.nodeFullPath.substring(getLockName().length() + 1);

  // 4. 遍歷所有的節(jié)點(diǎn),進(jìn)行名稱的比對(duì)

  for (String child : children) {

  if (child.equals(childNodeName)) {

  break;

  }

  previousNodeName = child;

  }

  } catch (KeeperException | InterruptedException e) {

  e.printStackTrace();

  }

  return previousNodeName;

  }

  }

  4.5. 子節(jié)點(diǎn)實(shí)現(xiàn)的非阻塞型鎖

  package com.qianfeng.lock.childNodeLock;

  /**

  * @author 千鋒大數(shù)據(jù)教研院 - 章魚哥

  * @company 北京千鋒互聯(lián)科技有限公司

  */

  public class ZkChildNodeNoneBlockingLocker extends ZkChildNodeLockerBase {

  public ZkChildNodeNoneBlockingLocker(String connectString, String lockName) {

  super(connectString, lockName);

  }

  public ZkChildNodeNoneBlockingLocker(String lockName) {

  super(lockName);

  }

  @Override

  protected boolean canLock() {

  // 1. 判斷是否有之前的節(jié)點(diǎn)

  String previousNodeName = getPreviousNode();

  // 2. 如果不存在之前的節(jié)點(diǎn),說明上鎖成功

  if (previousNodeName == null) {

  return true;

  }

  // 3. 如果存在之前的節(jié)點(diǎn),說明上鎖失敗,刪除自己創(chuàng)建的子節(jié)點(diǎn)即可

  deleteNode(this.nodeFullPath);

  return false;

  }

  }

  4.6. 子節(jié)點(diǎn)實(shí)現(xiàn)的阻塞型鎖

  A程序在進(jìn)行上鎖的時(shí)候,發(fā)現(xiàn)已經(jīng)被其他的程序獲取到鎖了,自己需要等待其他的程序釋放鎖。基本的實(shí)現(xiàn)邏輯就是自己監(jiān)控已經(jīng)創(chuàng)建好的節(jié)點(diǎn),發(fā)現(xiàn)這個(gè)節(jié)點(diǎn)消失的時(shí)候,自己去創(chuàng)建節(jié)點(diǎn)。但是為什么沒有用節(jié)點(diǎn)作為鎖來實(shí)現(xiàn)阻塞型的鎖呢?是因?yàn)檫@里有“羊群效應(yīng)”。

  假如有100個(gè)程序來獲取鎖,結(jié)果發(fā)現(xiàn)鎖已經(jīng)被其他的程序注冊(cè)了,于是這100個(gè)程序都去監(jiān)聽這個(gè)節(jié)點(diǎn)。一旦這個(gè)節(jié)點(diǎn)被刪除,這100個(gè)程序都可以獲取到狀態(tài)的變更,會(huì)同時(shí)請(qǐng)求ZooKeeper創(chuàng)建節(jié)點(diǎn)。這樣會(huì)帶來瞬時(shí)的資源占用劇增,嚴(yán)重的甚至可能導(dǎo)致服務(wù)器宕機(jī)。因此,我們?cè)趯?shí)現(xiàn)阻塞型鎖的時(shí)候,使用的是有序的子節(jié)點(diǎn)來實(shí)現(xiàn)的,每一個(gè)程序監(jiān)控比自己編號(hào)小的節(jié)點(diǎn)即可。詳情可參考3.2.章節(jié)的內(nèi)容。

  package com.qianfeng.lock.childNodeLock;

  import org.apache.zookeeper.AddWatchMode;

  import org.apache.zookeeper.KeeperException;

  import java.util.concurrent.CountDownLatch;

  /**

  * @author 千鋒大數(shù)據(jù)教研院 - 章魚哥

  * @company 北京千鋒互聯(lián)科技有限公司

  */

  public class ZkChildNodeBlockingLocker extends ZkChildNodeLockerBase {

  // 等待釋放信號(hào)

  private CountDownLatch latch = new CountDownLatch(1);

  public ZkChildNodeBlockingLocker(String connectString, String lockName) {

  super(connectString, lockName);

  }

  public ZkChildNodeBlockingLocker(String lockName) {

  super(lockName);

  }

  @Override

  protected boolean canLock() {

  // 獲取自己創(chuàng)建的子節(jié)點(diǎn)之前序號(hào)的節(jié)點(diǎn)

  String previousNode = getPreviousNode();

  // 如果之前節(jié)點(diǎn)不存在,說明已經(jīng)上鎖成功

  if (previousNode == null) {

  return true;

  }

  // 如果有比當(dāng)前創(chuàng)建的節(jié)點(diǎn)序號(hào)更小的節(jié)點(diǎn),說明上鎖失敗,自己阻塞,監(jiān)聽之前的節(jié)點(diǎn)即可

  try {

  getZkCli().addWatch(getLockName() + "/" + previousNode, event -> {

  if (event.getType().equals(Event.EventType.NodeDeleted)) {

  // 說明之前節(jié)點(diǎn)被刪除掉了

  latch.countDown();

  }

  }, AddWatchMode.PERSISTENT);

  // 等待信號(hào)

  latch.await();

  } catch (KeeperException | InterruptedException e) {

  e.printStackTrace();

  }

  // 自己成為了最小的節(jié)點(diǎn),上鎖成功

  return true;

  }

  }

好程序員公眾號(hào)

  • · 剖析行業(yè)發(fā)展趨勢
  • · 匯聚企業(yè)項(xiàng)目源碼

好程序員開班動(dòng)態(tài)

More+
  • HTML5大前端 <高端班>

    開班時(shí)間:2021-04-12(深圳)

    開班盛況

    開班時(shí)間:2021-05-17(北京)

    開班盛況
  • 大數(shù)據(jù)+人工智能 <高端班>

    開班時(shí)間:2021-03-22(杭州)

    開班盛況

    開班時(shí)間:2021-04-26(北京)

    開班盛況
  • JavaEE分布式開發(fā) <高端班>

    開班時(shí)間:2021-05-10(北京)

    開班盛況

    開班時(shí)間:2021-02-22(北京)

    開班盛況
  • Python人工智能+數(shù)據(jù)分析 <高端班>

    開班時(shí)間:2021-07-12(北京)

    預(yù)約報(bào)名

    開班時(shí)間:2020-09-21(上海)

    開班盛況
  • 云計(jì)算開發(fā) <高端班>

    開班時(shí)間:2021-07-12(北京)

    預(yù)約報(bào)名

    開班時(shí)間:2019-07-22(北京)

    開班盛況
IT培訓(xùn)IT培訓(xùn)
在線咨詢
IT培訓(xùn)IT培訓(xùn)
試聽
IT培訓(xùn)IT培訓(xùn)
入學(xué)教程
IT培訓(xùn)IT培訓(xùn)
立即報(bào)名
IT培訓(xùn)

Copyright 2011-2023 北京千鋒互聯(lián)科技有限公司 .All Right 京ICP備12003911號(hào)-5 京公網(wǎng)安備 11010802035720號(hào)

中文在线免费看视频_国产成人精品亚洲日本在线观看_亚洲精品第一综合99久久_国产亚洲精品日韩综合网

            久久国产免费看| 制服丝袜一区二区三区| 亚洲视频精选在线| 欧美色图在线观看| 久久国产精品99久久久久久老狼| 精品久久久久一区二区国产| 97国产一区二区| 青青青伊人色综合久久| 国产精品网站在线播放| 欧美日韩三级视频| 懂色av一区二区三区免费观看| 亚洲综合免费观看高清完整版| 精品久久久久av影院| 91老师国产黑色丝袜在线| 美女视频一区在线观看| 亚洲免费在线看| 精品国产91亚洲一区二区三区婷婷| 91一区二区三区在线观看| 久久草av在线| 亚洲成va人在线观看| 中文字幕一区在线| 亚洲精品一线二线三线| 色999日韩国产欧美一区二区| 国产美女在线观看一区| 亚洲成av人片一区二区梦乃| 国产精品国产馆在线真实露脸 | 欧美性色黄大片| 国产精品羞羞答答xxdd| 日本不卡一区二区| 亚洲色图另类专区| 亚洲国产精品国自产拍av| 粉嫩av亚洲一区二区图片| 91视频在线观看免费| 欧美mv日韩mv国产| 日日嗨av一区二区三区四区| 国产精品久久久久久亚洲毛片| 欧美一区永久视频免费观看| 在线精品亚洲一区二区不卡| 波多野洁衣一区| 国产乱子轮精品视频| 免费精品视频最新在线| 亚洲成a天堂v人片| 亚洲线精品一区二区三区| 中文字幕成人av| 国产日韩精品一区二区三区| 精品久久人人做人人爽| 精品日韩成人av| 日韩区在线观看| 欧美一区二区精品在线| 91精品国产综合久久久蜜臀图片| 欧美视频一区在线| 欧美天堂亚洲电影院在线播放| 91免费看`日韩一区二区| 99久久精品国产观看| 99久久国产综合精品色伊| 99免费精品视频| jvid福利写真一区二区三区| 成人激情免费视频| 99精品欧美一区二区三区小说| 成人高清视频免费观看| eeuss鲁片一区二区三区| 成人高清免费观看| 91免费版pro下载短视频| 91免费版pro下载短视频| 在线观看视频一区二区欧美日韩| 在线视频国产一区| 欧美老人xxxx18| 日韩限制级电影在线观看| 日韩欧美在线不卡| 久久影音资源网| 国产精品久久久久9999吃药| 亚洲视频在线一区二区| 亚洲一区二区在线观看视频 | 夜夜爽夜夜爽精品视频| 夜夜揉揉日日人人青青一国产精品 | 日韩欧美国产一区二区三区| 97久久超碰国产精品电影| 99久久婷婷国产| 久久一日本道色综合| 欧美大片一区二区| 国产视频一区不卡| 亚洲欧美日韩国产综合| 亚洲成人精品在线观看| 久久狠狠亚洲综合| 欧美自拍偷拍午夜视频| 91国产丝袜在线播放| 欧美丰满嫩嫩电影| 久久久久久久久久久久久夜| 中文字幕一区二区5566日韩| 亚洲午夜在线电影| 国产一区在线看| 一本一道久久a久久精品综合蜜臀 一本一道综合狠狠老 | 精品日韩在线观看| 中文字幕制服丝袜成人av| 亚洲高清久久久| 国产精品一二二区| 欧美日韩国产在线播放网站| 精品国产乱子伦一区| 亚洲人被黑人高潮完整版| 强制捆绑调教一区二区| 成人免费福利片| 欧美一卡二卡在线| 亚洲日穴在线视频| 国产在线国偷精品免费看| 日本道精品一区二区三区| 久久午夜国产精品| 亚洲va欧美va国产va天堂影院| 国产精品77777| 91精品国产91综合久久蜜臀| 中文字幕一区二区三区乱码在线| 日本不卡免费在线视频| 色网站国产精品| 国产清纯白嫩初高生在线观看91 | 精品一区二区三区免费播放| 色综合久久综合中文综合网| 久久丝袜美腿综合| 天堂久久一区二区三区| 波多野结衣中文字幕一区| 精品国产网站在线观看| 亚洲成人在线观看视频| 99久久精品免费看国产| 久久精品一二三| 久久爱www久久做| 欧美另类久久久品| 亚洲综合色噜噜狠狠| 不卡视频免费播放| 国产女人18水真多18精品一级做| 蜜芽一区二区三区| 精品视频在线免费| 国产成人免费网站| 欧美日韩国产成人在线免费| 国产精品久久久久一区| 国产一区二区不卡在线| 日韩女优制服丝袜电影| 日本欧美韩国一区三区| 欧美精品一级二级| 亚洲国产欧美在线人成| 一本色道久久综合精品竹菊| 国产精品福利电影一区二区三区四区| 国产一区91精品张津瑜| 2020国产精品自拍| 麻豆精品一区二区| 欧美一区二区精品久久911| 午夜成人免费视频| 欧美人动与zoxxxx乱| 午夜av电影一区| 制服丝袜一区二区三区| 免费成人小视频| 精品国产区一区| 国产伦精品一区二区三区免费| 久久久久亚洲蜜桃| 国产麻豆精品久久一二三| 国产免费久久精品| 成人成人成人在线视频| 亚洲日本成人在线观看| 日韩欧美在线不卡| 久久精品久久综合| 久久久久久久久久久久久久久99 | 久久久国产精品午夜一区ai换脸| 韩国一区二区在线观看| 国产日本欧美一区二区| proumb性欧美在线观看| 亚洲激情成人在线| 91精品国产综合久久福利| 久久成人免费网站| 国产精品看片你懂得| 91久久精品一区二区| 日韩电影在线免费| 国产偷v国产偷v亚洲高清 | 欧美日本在线播放| 乱一区二区av| 欧美激情一区二区三区全黄| 91一区二区三区在线观看| 亚洲午夜三级在线| 精品免费99久久| 99热精品国产| 天天色天天操综合| 国产三级精品三级在线专区| 色欧美88888久久久久久影院| 肉肉av福利一精品导航| 久久精品亚洲精品国产欧美kt∨| 99精品桃花视频在线观看| 午夜激情一区二区| 国产欧美一区二区三区网站| 欧美吻胸吃奶大尺度电影| 国产在线精品一区二区| 一区二区三区鲁丝不卡| 精品理论电影在线观看 | 国产精品国产三级国产| 欧美日韩精品高清| 国产成人av一区二区| 婷婷夜色潮精品综合在线| 国产日韩综合av| 欧美丝袜第三区| 国产ts人妖一区二区| 爽好多水快深点欧美视频| 国产精品久线观看视频| 91精品午夜视频| 91美女在线观看| 国内精品在线播放|