在Java8中执行并行操作需要非线程安全帮助对象的惯用方法是什么?

时间:2015-04-11 14:41:12

标签: java arrays multithreading

我有一些像这样的代码

public List doSomething(List stuff) {
  ArrayList out = new ArrayList();
  BigNonThreadSafeObject bntso = new BigNonThreadSafeObject();
  for(Thing t: stuff)
    out.add(bntso.doSomethingComplicated(t));
  return out;
}

在Java8中并行执行此for循环(以利用多核处理)的惯用方法是什么?

当然,技巧是如何为每个工作线程初始化一个单独的BigNonThreadSafeObject而不必跳过ThreadLocal等的箍?

1 个答案:

答案 0 :(得分:0)

为每个线程提供单独对象的惯用方法是使用ThreadLocal。但是,这意味着ForkJoinPool中的所有线程将保留其BigNonThreadSafeObject的副本,直到线程终止。这听起来不是很好,除非你经常在同一组线程上做这个并行映射。

您可以尝试像commons-pool这样的对象池,并在map()执行检查 - >使用bntso->签入。但是,如果“工作”步骤很快,那么池上的争用会消耗你可能通过并行获得的任何收益。它很笨重,但你可以期待任何解决方案都很笨重。为每个操作实例设计的管道独立于所有其他实例,并且一旦实例关心它正在运行的线程,就会违反该假设。