【发布时间】:2014-12-19 17:16:09
【问题描述】:
我正在尝试更新我的应用程序中的值,我们将其称为 Foo 对象。 Foo 作为 java 对象是不可变的,但可以通过 Hibernate 实体在数据库中更新。我通过调用加载缓存覆盖(Guava Cache 作为实现)来访问 Foo 对象,该覆盖在不存在时从数据库加载值。此外,虽然并发写入是可能的,但对 Foo 对象的写入会很少,但读取会很多。
更新 Foo 对象的最佳方法是什么?更新时锁定缓存?其他一些结构设计?
请注意,在广阔的互联网上肯定有关于这个主题的信息,但我阅读了很多内容试图弄清楚这一点,以至于我自己都感到困惑。我目前倾向于在缓存实现类的更新方法上使用 ReentrantLock,但似乎应该有更好的方法。
【问题讨论】:
-
应用程序的各个部分是否需要知道“不可变”对象发生了变化?
-
@ThorbjørnRavnAndersen,不,我不这么认为,除非另一个“作者”需要知道它,这样我在更新对象时就不会出现竞争条件。
-
通常的解决方案是在对象更新时触发事件,请参阅 Swing 以获取执行此操作的大型代码库的示例。您可以使用锁和同步来避免重叠更新。
标签: java caching concurrency immutability