假设我有一个名为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/

10-12 03:41