假设我有一个名为MyCache
的Java Bean,它有多个getter和setter。 我的应用程序中有一个MyCache
实例。这是一个volatile
字段myCache
在MyCacheHolder
。 当我需要刷新MyCache
时,我创建了它的一个新副本(它需要时间),然后我只将参考myCache
分配给这个新对象。同时刷新缓存
许多线程正在同时阅读MyCacheHolder#myCache
。他们肯定会得到最新的参考,因为它是volatile
。但我不确定他们是否得到完全初始化的对象。该对象通过setter进行初始化。阅读主题不能看到myCache
的所有字段吗?如果是,那我该如何解决?
如果你1)分配所有的值,然后2)将完全初始化的** MyCache分配给volatile字段,你没有问题。如果您在发布后以'_any_'的方式突变'MyCahce',那么您有一个问题。考虑到'MyCache'是在多个线程之间共享的,我会投入大量的时间和精力来使'MyCahce'成为**完全不可变的**类;那么就不存在陈旧状态的问题。 –
是的,我完全是1)和2),但我仍然担心在分配给volatile变量之前通过setter设置到MyCache的某些值可能不会被其他线程看到。为了让其他线程可以看到某些“发生在......之前”的规则必须完成。 –