Hazelcast 无法使用IFunction更新IAtomicReference

Hazelcast 无法使用IFunction更新IAtomicReference,hazelcast,Hazelcast,我是hazelcast的新手,我正在使用它来分发自定义数据结构,尤其是bloom过滤器实现。由于过滤器可能变得相当大,我决定使用IFunction进行更新。我面临的问题如下:我正在对bloom filter引用执行alterAndGet(),并使用该引用更改其位集值。正如我所期望的那样,我得到了新的更新过滤器,但是引用本身没有更新。我查看了Hazelcast代码,发现实现使用equals()来决定是否更新引用值。我已经检查了返回的bloom过滤器和前一个过滤器是否不满足相等条件,因此我希望它已经

我是hazelcast的新手,我正在使用它来分发自定义数据结构,尤其是bloom过滤器实现。由于过滤器可能变得相当大,我决定使用IFunction进行更新。我面临的问题如下:我正在对bloom filter引用执行alterAndGet(),并使用该引用更改其位集值。正如我所期望的那样,我得到了新的更新过滤器,但是引用本身没有更新。我查看了Hazelcast代码,发现实现使用equals()来决定是否更新引用值。我已经检查了返回的bloom过滤器和前一个过滤器是否不满足相等条件,因此我希望它已经更新。有人知道我在这里遗漏了什么吗?

你能创建一个单元测试来验证问题吗


我编写了大部分功能。所以如果它坏了,我会修理它。如果我们确实需要一些东西来满足您的需求,而且工作量不大,我可能可以添加它。

问题应该得到解决,请查看我对您发布的相关公关的评论

事实上,我知道问题出在哪里了:我的对象有一个位集,它的等号完全取决于位集的等号。因为我不想每次获取现有的位集并更新它时都创建一个新的位集,但是因为它是相同的引用,所以它的equals返回true。在代码中,我看到只有当输入和输出不相等时才更新引用,但它确实返回了更新后的输出。我想它不应该像这样工作,对吧?为了安全起见:你知道Hazelcast会复制这个值,因为它需要越界。此外,对于本地呼叫,您将始终获得一份副本,而不是存储(或插入)的引用。把这件事放在一边;我同意代码可以稍微清理一下。即使没有更改,也没有理由返回新实例。它可以很容易地返回旧实例。我同意你的看法,如果它不改变,它就不应该更新引用,它还可以返回旧实例。然而,我观察到的是,新实例已更改,它返回新值,但不更新引用。原因是在我发送的iffunction中,我从旧实例获取位集,在新实例上设置它,然后更新它的值。我不想复制它,因为它太贵了。举例来说,我指的是一个BloomFilter对象,它是位集的包装器,它的等号取决于位集的等号。这有什么意义吗?顺便说一句,我希望我理解正确。当你说“Hazelcast将复制该值,因为它需要越过行”时,你说的是返回值,对吗?因为我使用的是一个函数,我说的是返回值;但我也在谈论插入值。e、 g.人员p1=新人员();原子参考集(p1);Person p2=atomicref.get();Person p3=atomicref.get();p1/p2/p3将是不同的对象实例。但是现在即使引用确实没有更改,引用也会更新,对吗?这不是有点低效吗?