您好,登錄后才能下訂單哦!
這篇文章主要介紹“ZooKeeper共享鎖怎么創建”,在日常操作中,相信很多人在ZooKeeper共享鎖怎么創建問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”ZooKeeper共享鎖怎么創建”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
眾所周知,在Java開發中,要創建一個單進程鎖非常簡單,使用JDK中自帶的java.util.concurrent.locks.Lock接口即可實現鎖的功能。
如今已經到了大數據、云的時代,而這種鎖已經無法滿足集群服務間鎖的需求了,本文將簡單說下如何使用ZooKeeper來實現共享鎖功能。至于什么是共享鎖呢?理解起來也很簡單:就是指在多個實例中使用同一把鎖。(我好像廢話了……)
同樣閃亮登場的還是我們的Curator Framework,它封裝了各種場景的鎖,比如:共享鎖、讀寫鎖、可撤銷鎖等。
LockStartup.java
package org.bigmouth.common.zookeeper.shared; import java.util.concurrent.TimeUnit; import org.apache.curator.framework.CuratorFramework; import org.apache.curator.framework.recipes.locks.InterProcessSemaphoreMutex; import org.bigmouth.common.zookeeper.config.ZooKeeperFactory; public class LockStartup { public static void main(String[] args) throws Exception { CuratorFramework client = ZooKeeperFactory.get(); // ZooKeeperFactory在上一篇文章《ZooKeeper學習筆記—配置管理》中有 final InterProcessSemaphoreMutex processSemaphoreMutex = new InterProcessSemaphoreMutex(client, "/lock"); printProcess(processSemaphoreMutex); System.out.println("Starting get lock..."); boolean flag = processSemaphoreMutex.acquire(12, TimeUnit.SECONDS); System.out.println(flag ? "Getting lock successful." : "Getting failed!"); printProcess(processSemaphoreMutex); Thread.sleep(20 * 1000); if (processSemaphoreMutex.isAcquiredInThisProcess()) { processSemaphoreMutex.release(); } printProcess(processSemaphoreMutex); client.close(); } private static void printProcess(final InterProcessSemaphoreMutex processSemaphoreMutex) { // 在本進程中鎖是否激活(是否正在執行) System.out.println("isAcquiredInThisProcess: " + processSemaphoreMutex.isAcquiredInThisProcess()); } }
啟動LockStartup,得到如下結果:
接著再啟動一個LockStartup實例,結果是無法獲取到鎖。程序還是會等待12秒,如果12秒后仍然無法獲取到鎖則結束:
如果我們把處理時間設置為10秒,等待時間為12秒。那么當第一個進程釋放后,第二個進程將會獲取到鎖。
Thread.sleep(10 * 1000);
還有適合其他場景的共享鎖就不一一做例子了,使用起來都類似。可以看下接口org.apache.curator.framework.recipes.locks.InterProcessLock的實現類。
到此,關于“ZooKeeper共享鎖怎么創建”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。