<span id="35v3v"><th id="35v3v"></th></span>
<address id="35v3v"></address>

    <address id="35v3v"></address>
      <address id="35v3v"><listing id="35v3v"><meter id="35v3v"></meter></listing></address>
        <listing id="35v3v"><listing id="35v3v"></listing></listing>

        <listing id="35v3v"><listing id="35v3v"><menuitem id="35v3v"></menuitem></listing></listing>

        <noframes id="35v3v"><noframes id="35v3v">
        當前位置: 首頁 / 技術分享 / 正文
        ZooKeeper實現分布式鎖

        2023-01-06

        節點    child 分布式

          1. 分布式鎖的介紹

          在Java的多線程部分,我們知道如果在一個jvm進程中,多個線程之間同時訪問一個資源,此時會有多線程的安全問題。為了解決這個線程安全的問題,我們可以使用“鎖”來實現。但是,多個jvm進程之間如果同時訪問一個資源呢?此時在Java部分學習到的“鎖”已經不能解決這個問題了,我們就需要“分布式鎖”來實現這樣的效果了。

          維基百科對分布式鎖的定義:

          分布式鎖,是控制分布式系統之間同步訪問共享資源的一種方式。在分布式系統中,常常需要協調他們的動作。如果不同的系統或是同一個系統的不同主機之間共享了一個或一組資源,那么訪問這些資源的時候,往往需要互斥來防止彼此干擾來保證一致性,在這種情況下,便需要使用到分布式鎖。

          2. 分布式鎖的分類

          在不同的業務場景下,分布式鎖也有不同的使用方式,常見的分類有兩種: 阻塞鎖 和 非阻塞鎖。

          阻塞鎖:

          當有多個jvm進程同時訪問一個共享的資源的時候,已經搶到分布式鎖的jvm進程執行自己的業務邏輯,沒有搶到分布式鎖的jvm進程進入阻塞狀態等待。獲取到分布式鎖的jvm進程在處理完自己的業務邏輯之后,會將鎖進行釋放。

          執行自己的業務邏輯爭搶分布式鎖事物開始搶到了鎖沒有搶到鎖釋放鎖事務結束

        分布式鎖-同步

          非阻塞鎖:

          當有多個jvm進程同時訪問一個共享的資源的時候,已經搶到分布式鎖的jvm進程執行自己的業務邏輯,沒有搶到分布式鎖的jvm進程不會等待,直接結束,不執行任何的業務邏輯。

          爭搶分布式鎖執行自己的業務邏輯事物開始搶到了鎖釋放鎖事務結束沒有搶到鎖

        分布式鎖-非阻塞

          3. 分布式鎖的原理

          使用ZooKeeper實現分布式鎖,其實就是在Zookeeper上進行節點的創建。多個程序同時需要操作一個共享的資源時,可以先在ZooKeeper進行節點的注冊,注冊成功的表示搶到了鎖,注冊失敗的表示沒有獲取到鎖。

          3.1. 使用節點實現

          所有的程序向ZooKeeper中注冊同一個指定名字的節點,首先將節點創建成功的程序持有鎖,可以操作共享資源。后來的程序在進行節點創建的時候,發現鎖已經存在了,于是無法重復注冊。

          3.2. 使用子節點實現

          所有的程序向ZooKeeper中的指定節點下注冊子節點(需要使用短暫、有序節點),以節點的序號為優先級,序號小的更早注冊,序號大的晚注冊。于是,序號小的節點獲取到鎖,其他的程序依次向前監聽節點。

          以/root節點,5個程序為例:

          A程序注冊節點/root/child0001

          此時子節點: { child0001 }

          自己就是序號最小的節點,可以獲取鎖,執行自己的邏輯操作

          B程序注冊節點/root/child0002

          此時的子節點: { child0001, child0002 }

          B發現自己不是最小的節點,說明有人捷足先登了,于是監聽自己前面的child0001節點

          C程序注冊節點/root/child0003

          此時的子節點: { child0001, child0002, child0003 }

          C發現自己不是最小的節點,說明有人捷足先登了,于是監聽自己前面的child0002節點

          此時A程序執行結束了,由于是短暫類型的節點,因此child0001節點會被刪除

          此時的子節點: { child0002, child0003 }

          B程序由于監聽了child0001,因此可以得知這個節點已經被刪除了,被喚醒之后發現自己就是最小的節點,獲取到鎖,執行邏輯

          D程序注冊節點/root/child0004

          此時的子節點: { child0002, child0003, child0004 }

          D發現自己不是最小的節點,說明有人捷足先登了,于是監聽自己前面的child0003節點

          此時B程序執行結束了,由于是短暫類型的節點,因此child0002節點會被刪除

          此時的子節點: { child0003, child0004 }

          C程序由于監聽了child0002,因此可以得知這個節點已經被刪除了,被喚醒之后發現自己就是最小的節點,獲取到鎖,執行邏輯

          E程序注冊節點/root/child0005

          此時的子節點: { child0003, child0004, child0005 }

          E發現自己不是最小的節點,說明有人捷足先登了,于是監聽自己前面的child0004節點

          ...

        分享: 更多

        上一篇:畢設項目-教輔機構信息化平臺

        下一篇:

        好程序員公眾號

        • · 剖析行業發展趨勢
        • · 匯聚企業項目源碼

        好程序員開班動態

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

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

          開班盛況

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

          開班盛況
        • 大數據+人工智能 <高端班>

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

          開班盛況

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

          開班盛況
        • JavaEE分布式開發 <高端班>

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

          開班盛況

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

          開班盛況
        • Python人工智能+數據分析 <高端班>

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

          預約報名

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

          開班盛況
        • 云計算開發 <高端班>

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

          預約報名

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

          開班盛況
        在線咨詢
        試聽
        入學教程
        立即報名

        Copyright 2011-2023 北京千鋒互聯科技有限公司 .All Right 京ICP備12003911號-5 京公網安備 11010802035720號

        黑人100部Av解禁片
        <span id="35v3v"><th id="35v3v"></th></span>
        <address id="35v3v"></address>

          <address id="35v3v"></address>
            <address id="35v3v"><listing id="35v3v"><meter id="35v3v"></meter></listing></address>
              <listing id="35v3v"><listing id="35v3v"></listing></listing>

              <listing id="35v3v"><listing id="35v3v"><menuitem id="35v3v"></menuitem></listing></listing>

              <noframes id="35v3v"><noframes id="35v3v">