【问题标题】:Apache Curator Lock Recipes RevokingApache Curator Lock 食谱撤销
【发布时间】:2016-01-27 06:07:27
【问题描述】:

我正在尝试测试 Apache Curator 中的可撤销锁定。我有两个线程试图获取锁。如果第一个测试获得了锁,第二个线程可以要求第一个线程释放锁,以便第二个线程可以获取它

        RetryPolicy retryPolicy = new ExponentialBackoffRetry(baseSleepTimeMills, maxRetries);
        CuratorFramework client = CuratorFrameworkFactory.newClient(hosts, retryPolicy);
        client.start();

        final InterProcessMutex lock = new InterProcessMutex(client, lockBasePath);

        Collection<String> nodes =  lock.getParticipantNodes();

        lock.makeRevocable(new RevocationListener<InterProcessMutex>(){

            @Override
            public void revocationRequested(InterProcessMutex lock1) {
                try {
                    if(lock.isAcquiredInThisProcess()){
                        lock.release();
                    }

                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }

        });

        if(nodes!=null && !nodes.isEmpty()){
            Revoker.attemptRevoke(client, nodes.iterator().next());
        }

        if (lock.acquire(waitTimeSeconds, TimeUnit.SECONDS)) {
            try {
                doSomeWork(lockName);
            } finally {
                lock.release();
            }
        } else {
            System.err.printf("%s timed out after %d seconds waiting to acquire lock on %s\n",
                    lockName, waitTimeSeconds, lockPath);
        }

问题是,当第二个线程调用attemptRevoke时,回调异步方法在第一个进程上被调用,但由于它是第三个线程的回调方法,如果调用lock.release它会抛出一个异常

java.lang.IllegalMonitorStateException: 你不拥有锁

那是根据 api

release() 如果调用线程是,则执行一次互斥锁释放 获得它的同一线程。

所以基本上这是不可能的,因为回调总是另一个线程。有没有其他方法可以实现这一目标?

感谢您的任何建议

-塔塔

【问题讨论】:

标签: java multithreading apache apache-zookeeper apache-curator


【解决方案1】:

您的 RevocationListener 应该中断持有锁的线程。然后,该线程可以释放锁。

【讨论】:

  • 你能举个例子吗?我看不到 InterProcessMutex 可以做什么:1.) 调用 acquire() 2.) 执行代码 3.) 避免调用 release() 并能够撤销之前获得的锁。使互斥锁可撤销意味着调用acquire() 的线程必须阻塞并等待被中断。
【解决方案2】:

您可以使用InterProcessSemaphoreMutex 代替InterProcessMutex 来释放另一个线程中的锁。

参考:Ability to release an InterProcessMutex from another thread #117

【讨论】:

    猜你喜欢
    • 2014-12-27
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 2019-01-29
    • 2021-11-01
    • 1970-01-01
    • 2018-12-01
    • 1970-01-01
    相关资源
    最近更新 更多