【发布时间】:2016-05-03 05:00:17
【问题描述】:
我有许多线程将类似结果的对象添加到数组中,并希望通过删除同步来提高该区域的性能。
为此,我希望每个线程将它们的结果发布到一个 ThreadLocal 数组中——然后一旦处理完成,我就可以将这些数组组合起来用于下一阶段。不幸的是,为此 ThreadLocal 有一个明显的问题:我无法在最后合并集合,因为没有线程可以访问另一个线程的集合。
我可以通过在创建它们时将每个 ThreadLocal 数组额外添加到 ThreadLocal 旁边的列表中来解决此问题,因此我稍后可以使用所有列表(这将需要同步,但每个线程只需要发生一次) ,但是为了避免内存泄漏,我将不得不以某种方式让所有线程最终返回以清理它们的 ThreadLocal 缓存......我更希望添加结果的简单过程是透明的,并且不需要任何除了简单地添加结果之外,还要进行后续工作。
是否有编程模式或现有的类似 ThreadLocal 的对象可以解决这个问题?
【问题讨论】:
-
您可以使用
ConcurrentHashMap代替 ThreadLocal 数组,并使用您的结果对象作为 map 中的键。 -
只需让每个线程产生“类似结果的对象”,其中包括这些对象应该插入到最终数组中的位置,例如包括数组索引。
-
结果的数量是否提前知道?导致线程被分配产生结果的任务的动力是什么?一开始就存在一组数据?随机事件异步到达?
-
@HankD 结果是由线程池产生的,所以随机结果来自随机线程。有些任务会产生多个结果,所以会有一个未知数。
标签: java arrays multithreading