膳绫擎代码中重要有两步操作:
- driver.createsTheLock:创建临时且有序的子节点,琅绫擎实现比较简单不做展开,重要存眷几种节点的模式:1)PERSISTENT(永远);2)PERSISTENT_SEQUENTIAL(永远且有序);3)EPHEMERAL(临时);4)EPHEMERAL_SEQUENTIAL(临时且有序)。
- internalLockLoop:壅塞等待直到获得锁。
看下internalLockLoop是怎么断定锁以及壅塞等待的,这里删除了一些无关代码,只保存主流程:
- //自旋直至获得锁
- while ( (client.getState() == CuratorFrameworkState.STARTED) && !haveTheLock )
- {
- //获取所有的子节点列表,并且按序号大年夜小到大年夜排序
- List<String> children = getSortedChildren();
- //根据序号断定当缁び节点是否为最小子节点
- String sequenceNodeName = ourPath.substring(basePath.length() + 1); // +1 to include the slash
- PredicateResults predicateResults = driver.getsTheLock(client, children, sequenceNodeName, maxLeases);
- if ( predicateResults.getsTheLock() )
- {
- //如不雅为最小子节点则认为获得锁
- haveTheLock = true;
- }
- else
- {
- //不然获取前一个子节点
- String previousSequencePath = basePath + "/" + predicateResults.getPathToWatch();
- //这里应用对象监督器做线程同步,当获取不到锁时监听前一个子节点删除消息并且进行wait(),当前一个子节点删除(也就是锁释放)时,回调会经由过程notifyAll唤醒此线程,此线程持续自旋断定是否获得锁
推荐阅读
沙龙晃荡 | 去哪儿、陌陌、ThoughtWorks在主动化运维中的实践!10.28不见不散!“计算机法度榜样可以在给定某种类其余义务 T 和机能度量 P 下进修经验 E ,如不雅其在义务 T 中的机能正好可以用 P>>>详细阅读
本文标题:基于Zookeeper的分布式锁
地址:http://www.17bianji.com/lsqh/38128.html
1/2 1