【问题标题】:How can I get the value of a cache from guava cacheloader and update the value without changing the value in cache?如何从 guava cacheloader 获取缓存的值并更新值而不更改缓存中的值?
【发布时间】:2019-12-01 19:23:45
【问题描述】:

我正在使用番石榴 LoadingCache 来存储 Animal 类型的对象,其中键是动物名称。到目前为止一切顺利。

然后我使用get() 方法获取缓存对象并检索Animal 对象。之后,我添加了这样一行:animal.setColor("blue");

之后我意识到番石榴缓存中以前的颜色也被改变了。我知道在java中修改一个对象也会改变它的原始状态(类似于传递引用)。但是对于缓存,我认为这会在我的代码中引入一些奇怪的错误。如何获取副本而不担心某些代码是否正在更新刚刚从缓存中检索到的对象?

【问题讨论】:

    标签: java caching guava


    【解决方案1】:

    从缓存中获取对象后,您必须复制该对象。没有可靠、高效、通用的方法来做到这一点——不过,在 Animal 类中编写复制构造函数是一种合乎逻辑的方法。

    或者您可以停止使用可变对象,这样可以普遍防止此类错误。

    【讨论】:

      【解决方案2】:

      我也遇到过类似的情况,所以我使用了 apache commons library 中的 SerializationUtils.clone。确保它不会被频繁调用,因为它的深层复制机制根据 javadoc 非常慢。

      【讨论】:

        猜你喜欢
        • 2011-02-17
        • 2023-03-15
        • 2015-10-28
        • 1970-01-01
        • 2015-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多