这篇文章主要介绍“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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。