假设我有一个名为MyCache
的Java Bean,它具有多个getter和setter。
我的应用程序中有一个MyCache
实例。这是volatile
中的myCache
字段MyCacheHolder
。
当我需要刷新MyCache
时,会为其创建一个新副本(这需要花费时间),然后我将引用myCache
分配给该新对象。
许多线程正在同时读取MyCacheHolder#myCache
。他们肯定会获得最新的参考,因为它是volatile
。但是我不确定他们是否得到了完全初始化的对象。该对象通过设置器初始化。读取线程可能看不到myCache
的所有字段吗?如果是,那我该如何解决?
最佳答案
使字段myCache
volatile
不足以使其成为线程安全,您还需要通过同步对getter和setter的访问或使MyCache
不可变(所有其非静态)来使类MyCache
线程安全。字段必须为final
并且它们本身是不可变的)。对我而言,最好的解决方案是使类不可变,因为一旦实例创建为其状态就无法更改,则可以通过任意数量的线程对其进行访问,而无需同步对其任何字段的访问。
关于java - 同时刷新缓存,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39002326/