【发布时间】: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() 如果调用线程是,则执行一次互斥锁释放 获得它的同一线程。
所以基本上这是不可能的,因为回调总是另一个线程。有没有其他方法可以实现这一目标?
感谢您的任何建议
-塔塔
【问题讨论】:
-
@Randgalt 在stackoverflow.com/questions/27113914/… 中提到了撤销配方
标签: java multithreading apache apache-zookeeper apache-curator