我有一些像这样的代码
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
等的箍?
答案 0 :(得分:0)
为每个线程提供单独对象的惯用方法是使用ThreadLocal
。但是,这意味着ForkJoinPool
中的所有线程将保留其BigNonThreadSafeObject
的副本,直到线程终止。这听起来不是很好,除非你经常在同一组线程上做这个并行映射。
您可以尝试像commons-pool这样的对象池,并在map()
执行检查 - >使用bntso->签入。但是,如果“工作”步骤很快,那么池上的争用会消耗你可能通过并行获得的任何收益。它很笨重,但你可以期待任何解决方案都很笨重。为每个操作实例设计的管道独立于所有其他实例,并且一旦实例关心它正在运行的线程,就会违反该假设。