Hazelcast - 如何理解Imap.unlock操作是否成功?

时间:2017-07-12 13:27:11

标签: locking hazelcast hazelcast-imap

我们在应用程序中使用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。

但有时即使在成功解锁通话后,锁似乎仍然存在。

正如我所说,这是一个间歇性问题,我无法提供可以再现问题的示例测试代码。

有什么建议吗?

此致

0 个答案:

没有答案