我们在应用程序中使用IMap锁。从保证获取密钥的IMap锁的线程(这是String类型),我们使用下面的代码片段解锁:
boolean isUnlockSuccess = false;
try {
distributedLocksMap.unlock(key);
isUnlockSuccess = true;
} catch (IllegalMonitorStateException e) {
// current thread does not hold the lock
logger.warn(String.format("[%d] Unlock failed for key: %s because current thread does not hold the lock! distributedLocksMapName: %s",
threadId,
key,
distributedLocksMapName), e);
} catch (Exception ex) {
logger.error(String.format("[%d] Error occured in unlock for key: %s ! Key could not be unlocked! distributedLocksMapName: %s",
threadId,
key,
distributedLocksMapName), ex);
}
我们的假设是,如果
没有例外distributedLocksMap.unlock(key);
呼叫,锁被释放。
首先,这个假设是正确的吗?没有与unlock相关的布尔返回方法,我们可以看到,如果一个不是锁的所有者的线程调用上面的方法,则抛出IllegalMonitorStateException。
其次,从我们的日志跟踪中,即使上面的方法调用完成也没有错误,我们间歇地看到锁没有被释放..我们找不到任何理由如何发生这种情况......
事实上我们的用例很简单:
1)试图获得锁定
2)如果锁定成功执行长时间的操作
3)解锁上面的snıppet。
但有时即使在成功解锁通话后,锁似乎仍然存在。
正如我所说,这是一个间歇性问题,我无法提供可以再现问题的示例测试代码。
有什么建议吗?
此致