<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                [TOC] # 簡介 很多機器去訪問,但是一次只能給一臺機器訪問 ![](https://box.kancloud.cn/4a6e719f9dbd33b0363252f74477d835_894x296.png) # 代碼實現 我們在命令行中創建個節點`create /locks ""` 因為代碼中沒有判斷,沒有父節點就創建 ~~~ package lock; import org.apache.zookeeper.*; import java.io.IOException; import java.util.Collections; import java.util.List; import java.util.Random; import java.util.concurrent.CountDownLatch; public class ClientLock { private static final String hosts = "192.168.33.12:2181,192.168.3.33:2181"; //超過2秒就認為掛了 private static final int sessionTimeOut = 2000; //父節點 private String groupNode = "locks"; //子節點,都是這個名字,只是名字后面的序號不一樣 private String subNode = "sub"; private boolean haveLock = false; private ZooKeeper zk = null; //當前client創建的子節點 private volatile String thisPath; //latch就相當于一個對象,當latch.await()方法執行時,線程就會等待 //當latch的count減為0的時候,將會喚醒等待的線程 //讓主線程阻塞掉 private CountDownLatch countDownLatch = new CountDownLatch(1); private void connectZookeeper() throws Exception { //一new完就往下走,但是這時候客戶端還沒完成連接,所以我們要等他創建好 //一旦成功握手這邊的process就會回調一次 zk = new ZooKeeper(hosts, sessionTimeOut, new Watcher() { public void process(WatchedEvent watchedEvent) { //SyncConnected同步連接 //回調了并且事件等于連接成功 if (watchedEvent.getState() == Event.KeeperState.SyncConnected) { //把計數減少,然后主線程就可以往下走了 countDownLatch.countDown(); } //收到事件通知后的回調函數(應該是我們自己的事件處理邏輯) System.out.println(watchedEvent.getType() + "---" + watchedEvent.getPath()); try { //子節點發生變化 if ((watchedEvent.getType() == Event.EventType.NodeChildrenChanged) && (watchedEvent.getPath().equals("/" + groupNode))) { //獲取子節點對父節點進行監聽 List<String> childrenNodes = zk.getChildren("/" + groupNode, true); String thisNode = thisPath.substring(("/" + groupNode + "/").length()); //排序,去比較自己是否是最小的id Collections.sort(childrenNodes); if (childrenNodes.indexOf(thisNode) == 0) { //訪問共享資源,刪除那把鎖 doSomething(); //重新注冊一把鎖 thisPath = zk.create("/"+groupNode+"/"+subNode,null, ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL); } } } catch (Exception e) { e.printStackTrace(); } } }); countDownLatch.await(); //1.程序一進來就先注冊一把鎖到zk上 //創建子節點,并且這個子節點后面是跟序號的,在子節點的名稱后面加上一串數字后綴,避免沖突,而且子節點是短暫的 thisPath = zk.create("/" + groupNode + "/" + subNode, null, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL); //wait一小會,便于觀察 Thread.sleep(new Random().nextInt(1000)); //從zk的鎖父目錄下,獲得所有子節點,并且注冊對父節點的監聽 List<String> childrenNodes = zk.getChildren("/" + groupNode, true); //如果爭搶資源的程序就只有自己,則可以直接去訪問共享資源 if (childrenNodes.size() == 1) { doSomething(); thisPath = zk.create("/" + groupNode + "/" + subNode, null, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL); } } //處理業務邏輯,并且在最后釋放鎖,共享資源的訪問寫在這里 private void doSomething() throws Exception { try { System.out.println("gain lock: " + thisPath); Thread.sleep(2000); //do something } finally { System.out.println("finished: " + thisPath); //將thisPath刪除, 監聽thisPath的client將獲得通知 //訪問完畢后,需要手動刪除這個節點 zk.delete(this.thisPath, -1); } } public static void main(String[] args) throws Exception { ClientLock clientLock = new ClientLock(); clientLock.connectZookeeper(); Thread.sleep(Long.MAX_VALUE); } } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看