如何安全地将可变对象从一个线程发布到另一个线程

时间:2013-08-26 13:11:41

标签: java concurrency

例如,我有一个没有同步的可变类Foo(或ArrayList)。 构造这样的对象需要时间,所以我想在一个单独的线程中执行它。

如果我将计算结果存储在某处并稍后从另一个线程访问它,那将不是线程安全的,因为需要同步或volatile,对吧? (我实际上不太确定)

所以我正在寻找一种方法将这样的对象从一个线程传递到另一个线程,而不需要同步Foo。

3 个答案:

答案 0 :(得分:1)

您的要求与Producer Consumer Pattern匹配。 Java的并发包提供了线程安全的集合(如BlockingQueue等)。 Producer将创建对象并将其放在BlockingQueue上。然后消费者拿起对象。这是example implementation

答案 1 :(得分:1)

首先想知道这是不是可以通过创建Future并在稍后的同一个执行线程中获得结果来解决的问题。这将使一切变得非常容易。

答案 2 :(得分:0)

你也可以使用AtomicReference来看看这个答案:When to use AtomicReference in Java?

另请参阅此处:Java Concurrency: CAS vs Locking

也就是说,并发编程很难正确。所以我建议你尽量保持简单,在常用锁上使用java提供的标准方式,synchronize。如果您注意到这是瓶颈,那么您可以随后使用其他更复杂的方法。