是否有可以排序的CopyOnWriteArrayList的替代方法?

我在GUI(梯度,纹理,文本等)中的'对象'上绘制了一系列'效果'。 底层系统的本质意味着这个效果集合可以被多个线程访问。 大部分操作都是读取操作,所以目前我正在使用可以正常工作的CopyOnWriteArrayList。

但是现在我需要根据绘制顺序对效果集合进行排序,无论何时添加新效果或更改效果的绘制顺序。 我还需要能够在forwards和reverse(iterater.next()&iterator.previous())中遍历集合。

经过一番研究后,我发现CopyOnWriteArrayLists不喜欢被排序:

CopyOnWriteArrayList的行为

如果您尝试对CopyOnWriteArrayList进行排序,您将看到该列表将引发UsupportedOperationException异常(该排序在集合上调用集N次)。 只有在读数超过90%时,才应使用此读数。

我还发现使用ConcurrentSkipListSet的建议,因为它处理并发和排序,但看着JavaDoc,我很担心这一点:

请注意,与大多数收藏不同,尺寸方法不是一种常量操作。

而且我使用&相当大的依赖size()方法。

我可以在效果集合上实现一个手动同步系统作为标准ArrayList,但这是一个非常大的重构,如果有人有任何想法,我宁愿耗尽所有其他可能性? 感谢你坚持到目前为止。


可能最好的方法是在您对收藏进行分类的位置进行手动同步。 你可以做一些事情(伪代码):

synchronize { 

convert copyonwritearrylist to normal list. 
sort normallist. 
convert normal list to copyonwritearraylist and replace the shared instance 

}

或者,您可以使用正常的ArrayList并使用ReentrantReadWriteLock推出您自己的解决方案。如果您有更多的读取而不是写入,这应该可以正常工作。

链接地址: http://www.djcxy.com/p/76111.html

上一篇: Is there an alternative to CopyOnWriteArrayList which can be sorted?

下一篇: Is ConcurrentHashMap analogy to CopyOnWriteArrayList