当前位置: 首页 > 知识库问答 >
问题:

Hazelcast-将锁键与地图值关联以进行锁监控的策略/算法?

景凌
2023-03-14

我有一个要求,我无法找到使用hazelcast IMap和ILock构造的解决方案。

我需要跟踪在分布式映射上获取的所有锁(在成功的IMap.tryLock(K key)调用后获取的锁)。每个成功获取的锁都必须与映射中的自定义对象相关联/配对以进行跟踪。(这些自定义对象包含用于监控目的的应用程序特定的储物柜信息。)我想要的是,当成功获取锁时,与锁相关的关联自定义对象必须自动原子地放到映射中。并且当锁被释放时,与锁相关的关联自定义对象必须自动原子地驱逐。

换句话说,我想正确跟踪所有未释放锁的锁柜信息。

我的第一次尝试/倾向是实现如下锁定实用程序方法:

public boolean tryLockUtilMethod(String key, long maxTimeToWaitForTheLockInMilis) {
        boolean isLockAcquired = false;
        try {
            isLockAcquired = IMap.tryLock(key, maxTimeToWaitForTheLockInMilis, TimeUnit.MILLISECONDS);
        } catch (Exception e) {
            ...
        }

        if (isLockAcquired) {
            putLockInfoToMapAfterLockAcquire(key);

        }
    }

和解锁实用程序方法,如下所示:

public void unlockUtilMethod(String key) {

            boolean isUnlockSuccess = false;

            try {
                IMap.unlock(key);
                isUnlockSuccess = true;
            } catch (IllegalMonitorStateException e) {
                // current thread does not hold the lock
                ...
            } catch (Exception ex) {
                ...
            }

            if (isUnlockSuccess) {
                removeLockInfoAfterUnlockSuccess(key);
            }
        }

显然,这种方法容易出错,因为锁获取/释放操作和后续的映射put(在示例代码putLockInfoToMapAfterLockAcquire方法中)/remove(在示例代码removeLockInfoAfterUnlockSuccess方法中)操作不是原子的。。。

我无法找到使用hazelcast并发构造的解决方案。

保存锁相关信息并确保它们与锁同步的正确方法是什么?以前没有人有类似的要求吗?

感谢您的指导

共有1个答案

方博
2023-03-14

AFAIK在API级别上不直接支持遍历或获取有关从Imap接口获得的锁的信息。所以我认为你自己做这件事的方式是正确的。对于同步锁信息和锁,可以使用hazelcast事务。

 类似资料:
  • 我需要在没有任何其他线程拦截的情况下同时锁定一些地图项目。我的意思是我想锁定10个项目,我想我需要使用循环,但我不想在锁定第5个项目后被阻止锁定其余5个项目。我是否需要使用另一个映射独立锁来包装锁定代码块?

  • 主要内容:1.死锁无知,2.死锁预防,3.避免死锁,4.死锁检测和恢复1.死锁无知 死锁无知是所有机制中使用最广泛的方法。 许多操作系统主要为最终用户使用。 在这种方法中,操作系统假定永远不会发生死锁。 它只是无视死锁。 这种方法最适合用户使用系统仅用于浏览和所有其他常规内容的单个最终用户系统。 正确性和性能之间总是有一个折衷。 Windows和Linux等操作系统主要关注性能。 但是,如果死锁发生的次数是100次,那么系统的性能就会一直下降,如果它始终使用死锁处理

  • 本文向大家介绍谈谈锁机制与InnoDB锁算法?相关面试题,主要包含被问及谈谈锁机制与InnoDB锁算法?时的应答技巧和注意事项,需要的朋友参考一下 MyISAM和InnoDB存储引擎使用的锁: MyISAM采用表级锁(table-level locking)。 InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁 表级锁和行级锁对比: 表级锁: MySQL中锁定 粒度

  • 问题内容: 我在这里思考:如果您有2个线程执行需要同步的FAST操作,那么非阻塞方法不是比阻塞/上下文切换方法更快/更好的方法吗? 非阻塞的意思是: while(true){如果(checkAndGetTheLock())中断;} 如果您有太多线程在锁中循环,我唯一想到的就是饥饿(CPU耗尽)。 如何平衡一种方法与另一种方法? 问题答案: 以下是 Java Concurrency in Pract

  • 我们正在尝试使用Apache Camel进行集群。到目前为止,我们在一个节点上完成了它,并且工作得很好。 一个节点:我将readlock策略设置为“changed”,它将跟踪camelLock文件的文件变化,并且只有当文件下载完成时,它才会被拿起进行处理。但是camel readlock策略“已改变”在聚类中是不鼓励的。根据camel文档,建议使用“幂等”。这就是我使用5GB文件进行测试时所发生的

  • 我在Java有一个很大map=concurrenthashMap(),而Key、Value是某种对象结构。假设这个映射的键集是keyset。 现在我下面有一个计算程序。我的问题是我如何能够获得一个更好的性能通过不使用全地图锁。是否有任何选择,如使用每键锁或使用其他类型的数据结构? 考虑到这是一个很大的映射,使用every-key锁可能不是一种可接受的方法。