我的情况是我有两个主题。第一个线程生成许多对象,第二个线程在创建所有对象之前无法访问这些对象。之后,第二个线程读取这些对象中的字段,但与第一个同时执行。此时,没有线程正在更改对象字段的值。 对象未同步。我应该同步它们吗?
答案 0 :(得分:4)
我建议使用AtomicReference<Collection<SomeObject>>
。第一个线程将生成对象集合并执行reference.put(collection)
。第二个线程只有在reference.get()
上设置后才能看到对象(AtomicReference
)。这是javadocs for AtomicReference
。您还可以将对象设置为数组或任何类型的集合,例如List
。
如果认识到在AtomicReference
上设置集合(或数组)后,您无法对集合进行任何更改,那么这一点非常重要。您无法添加其他项目,清除它等。如果您想要真正并发访问对象集合,那么您应该查看ConcurrentHashMap
和朋友。
我应该同步它们吗?
如果对象不会在之后 后被放入你的集合中,那么不需要使它们同步。
答案 1 :(得分:1)
同时从多个线程读取数据没有任何问题。尝试修改该数据时会出现问题。只要对象被完全初始化并且值是第二个线程接收实际值(没有缓存等问题),同时从多个线程读取数据就没有问题。