【问题标题】:How to safely publish mutable object from one thread to another如何安全地将可变对象从一个线程发布到另一个线程
【发布时间】:2013-08-26 13:11:41
【问题描述】:

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

如果我将计算结果存储在某处,然后从另一个线程访问它,那将不是线程安全的,因为需要同步或易失性,对吧? (这里其实我不太确定)

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

【问题讨论】:

  • 我不能 100% 确定我理解您的要求,但也许 synchronized singleton 会起作用。
  • @Dukeling 你肯定误会我的意思了。我会尽量澄清我的问题。

标签: java concurrency


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您也可以为此使用AtomicReference,看看这个答案:When to use AtomicReference in Java?

      也可以看看这里:Java Concurrency: CAS vs Locking

      也就是说,并发编程很难正确。所以我建议你尽可能简单,使用java提供的标准方式,synchronize在一个普通的锁上。如果您发现这是瓶颈,您以后可以随时使用另一种更复杂的方法。

      【讨论】:

        最近更新 更多