CopyOnwriteArrayList替代频繁更新

时间:2011-10-04 10:14:22

标签: java multithreading

请随时纠正我。

构建需要时间排序的市场数据缓存的场景(即按时间元素排序)。缓存将有很多更新。

逻辑规定List是一个合理的选择,因为索引是免费的,并且易于执行getOldestElem list.get(0);二分搜索等。

这个缓存将由多个线程使用,显然是读取和更新指向CopyOnWriteArrayList的缓存。 (Javadoc表示这不适合大尺寸和频繁更新)

我正在寻找替代或更好的想法?

2 个答案:

答案 0 :(得分:3)

如果现有记录很少(或永远不会)更新,那么“频繁更新”是经常添加的,您可以使用时间顺序通过分离旧元素和新元素来优化数据结构。

例如,您可以将缓存分段为多个CopyOnWriteArrayList个对象,每个对象不超过固定数量的元素,每个段包含数据的时间子范围。频繁添加将增加最后一个段,直到达到最大大小,此时您将为后续更新附加新段。通过保持最大段大小足够小,可以避免CopyOnWriteArrayList的性能问题。您应该在自己的List类中隐藏实现细节。


修改 删除旧元素同样只改变一个段:最旧的段。

答案 1 :(得分:2)

最适合测试您的使用案例,但受ReadWriteLock保护的ArrayList可能会为您提供更好的效果。