我有许多线程向一个数组添加类似于结果的对象,并希望通过移除同步来提高这个区域的性能。
为了做到这一点,我想让每个线程将其结果发布到ThreadLocal数组中,然后在处理完成后,我可以将数组组合用于下一阶段。不幸的是,为此ThreadLocal存在一个显眼的问题:当没有任何线程可以访问另一个线程的集合时,我无法在最后组合这些集合。
我可以通过在创建ThreadLocal时将每个ThreadLocal数组附加到列表旁边来解决这个问题,以便稍后我可以使用所有列表(这将需要同步,但每个线程只需要进行一次),但是为了避免内存泄漏,我将不得不以某种方式让所有线程在结束时返回以清理它们的ThreadLocal缓存... 我希望简单的添加结果过程是透明的,不需要除添加结果之外的任何后续工作。
是否有编程模式或现有的ThreadLocal-like对象可以解决这个问题?
为了做到这一点,我想让每个线程将其结果发布到ThreadLocal数组中,然后在处理完成后,我可以将数组组合用于下一阶段。不幸的是,为此ThreadLocal存在一个显眼的问题:当没有任何线程可以访问另一个线程的集合时,我无法在最后组合这些集合。
我可以通过在创建ThreadLocal时将每个ThreadLocal数组附加到列表旁边来解决这个问题,以便稍后我可以使用所有列表(这将需要同步,但每个线程只需要进行一次),但是为了避免内存泄漏,我将不得不以某种方式让所有线程在结束时返回以清理它们的ThreadLocal缓存... 我希望简单的添加结果过程是透明的,不需要除添加结果之外的任何后续工作。
是否有编程模式或现有的ThreadLocal-like对象可以解决这个问题?
ConcurrentHashMap
代替ThreadLocal数组,并将结果对象用作映射中的键。 - justAbit