首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >馆长层次锁(重叠锁)

馆长层次锁(重叠锁)
EN

Stack Overflow用户
提问于 2017-07-05 17:36:56
回答 1查看 207关注 0票数 3

我成功地锁定了/ads/lock/0-test1,但却无法锁定/ads/lock

我怎么解决这个问题?

代码语言:javascript
复制
InterProcessMutex lock1 = new InterProcessMutex(client, "/ads/lock/0-test1");
if(lock1.acquire(30000, TimeUnit.MILLISECONDS)){
   InterProcessMutex lock2 = new InterProcessMutex(client, "/ads/lock");

   if(lock2.acquire(30000, TimeUnit.MILLISECONDS)) {  //Failing
   ...
   }
}

更新:--这是https://github.com/Microsoft/Cluster-Partition-Rebalancer-For-Kafka/ZookeeperBackedAdoptionLogicImpl.java锁在第250行(详细路径)和299(根路径)发生的本质所在。因此,当另一个实例尝试锁一个详细的路径(250)时,当根路径(299)被锁定时,锁失败。逻辑是有效的,但根锁从未被获得。

更新2: --我编写了一个小程序来检查重叠锁是否工作,以及它是否工作。

代码语言:javascript
复制
public class LockTesting {
    public static final String ROOT_LOCK = "/locks";
    public static final String CHILD_LOCK = ROOT_LOCK+"/child";
    private static CuratorFramework client;

    public static void main(String[] args) throws Exception {

        client = CuratorFrameworkFactory.newClient("127.0.0.1:2181", new ExponentialBackoffRetry(1000, 30));
        client.start();
        InterProcessMutex lock1 = new InterProcessMutex(client, CHILD_LOCK);
        if (lock1.acquire(30000, TimeUnit.MILLISECONDS)) {
            System.out.println("Child Locked");
            InterProcessMutex lock2 = new InterProcessMutex(client, ROOT_LOCK);
            if (lock2.acquire(30000, TimeUnit.MILLISECONDS)) {
                System.out.println("Root Locked");
            }
        }

    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-05 21:11:11

虽然没有显式地记录(但请参阅technote 7),但管理员用于创建锁的机制取决于特定znode路径的子节点。InterProcessMutex饲养员锁具配方的一个实现,它的文档确实包含了这些细节。通过尝试使用这样的层次结构,您实际上是在扰乱锁的内部结构。

锁定的路径应该被认为是一个“对象”,其内部znodes是不可访问的,并且可能发生更改。

对更新的响应

该守则确实是这种不当使用的一个例子。

对Update2的响应

是的,有时也能用。但这取决于InterProcessMutex实现的内部细节。您会发现,对于某些锁名,这将有效,而对于另一些锁名称,它将不起作用,或者您将有未定义的行为。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44932695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档