我应该从多个线程访问(而不是更改)对象吗?

时间:2012-10-03 21:27:47

标签: java multithreading concurrency synchronization

我的情况是我有两个主题。第一个线程生成许多对象,第二个线程在创建所有对象之前无法访问这些对象。之后,第二个线程读取这些对象中的字段,但与第一个同时执行。此时,没有线程正在更改对象字段的值。 对象未同步。我应该同步它们吗?

2 个答案:

答案 0 :(得分:4)

我建议使用AtomicReference<Collection<SomeObject>>。第一个线程将生成对象集合并执行reference.put(collection)。第二个线程只有在reference.get()上设置后才能看到对象(AtomicReference)。这是javadocs for AtomicReference。您还可以将对象设置为数组或任何类型的集合,例如List

如果认识到在AtomicReference上设置集合(或数组)后,您无法对集合进行任何更改,那么这一点非常重要。您无法添加其他项目,清除它等。如果您想要真正并发访问对象集合,那么您应该查看ConcurrentHashMap和朋友。

  

我应该同步它们吗?

如果对象不会在之后 后被放入你的集合中,那么需要使它们同步。

答案 1 :(得分:1)

同时从多个线程读取数据没有任何问题。尝试修改该数据时会出现问题。只要对象被完全初始化并且值是第二个线程接收实际值(没有缓存等问题),同时从多个线程读取数据就没有问题。