同时刷新缓存

时间:2016-08-17 16:53:48

标签: java concurrency

假设我有一个名为MyCache的Java Bean,它有多个getter和setter。 我的应用程序中有一个MyCache实例。它是volatile中的myCache字段MyCacheHolder。 当我需要刷新MyCache时,我创建了它的新副本(需要时间),然后我只是将引用myCache分配给这个新对象。

许多线程同时阅读MyCacheHolder#myCache。他们肯定会获得最新的参考资料,因为它是volatile。但是我不确定他们是否得到了完全初始化的对象。该对象通过setter初始化。是否有可能阅读线程不会看到myCache的所有字段?如果是,那我该如何解决呢?

2 个答案:

答案 0 :(得分:1)

使字段myCache volatile不足以使其成为线程安全的,您需要通过同步访问getter和setter或者制作来使类MyCache线程安全MyCache不可变的(所有非静态字段必须是final并且它们本身是不可变的)。对我来说,最好的解决方案是使类不可变,因为一旦创建的实例的状态不能改变,它可以被任意数量的线程访问,而无需同步访问其任何字段。

答案 1 :(得分:0)

如果缓存对象为真,则通过调用多个setter设置JavaBean(带有一个参数的setter)和允许的缓存对象状态,然后 设置器中的同步帮助。

不变性与JavaBean规范相矛盾。

因此,如果您需要JavaBean - 在缓存外部对象中进行同步。

如果JavaBean不是强制性的 - 使用不可变对象。