假设我有一个名为MyCache
的Java Bean,它有多个getter和setter。
我的应用程序中有一个MyCache
实例。它是volatile
中的myCache
字段MyCacheHolder
。
当我需要刷新MyCache
时,我创建了它的新副本(需要时间),然后我只是将引用myCache
分配给这个新对象。
许多线程同时阅读MyCacheHolder#myCache
。他们肯定会获得最新的参考资料,因为它是volatile
。但是我不确定他们是否得到了完全初始化的对象。该对象通过setter初始化。是否有可能阅读线程不会看到myCache
的所有字段?如果是,那我该如何解决呢?
答案 0 :(得分:1)
使字段myCache
volatile
不足以使其成为线程安全的,您需要通过同步访问getter和setter或者制作来使类MyCache
线程安全MyCache
不可变的(所有非静态字段必须是final
并且它们本身是不可变的)。对我来说,最好的解决方案是使类不可变,因为一旦创建的实例的状态不能改变,它可以被任意数量的线程访问,而无需同步访问其任何字段。
答案 1 :(得分:0)
如果缓存对象为真,则通过调用多个setter设置JavaBean(带有一个参数的setter)和允许的缓存对象状态,然后 设置器中的同步帮助。
不变性与JavaBean规范相矛盾。
因此,如果您需要JavaBean - 在缓存外部对象中进行同步。
如果JavaBean不是强制性的 - 使用不可变对象。