我在GUI中的'对象'上绘制了'效果'的集合(渐变,纹理,文本等)。底层系统的本质意味着可以通过多个线程访问此效果集合。大多数操作都是读操作,所以目前我正在使用CopyOnWriteArrayList,该工作正常。
但是现在我需要在添加新效果或更改效果的绘制顺序时根据绘制顺序对效果集合进行排序。我还需要能够在前进和前后迭代集合。 reverse(iterater.next()& iterator.previous())。
经过一些研究后我发现CopyOnWriteArrayLists不喜欢被排序:
Behaviour of CopyOnWriteArrayList
如果您尝试对CopyOnWriteArrayList进行排序,您将看到列表抛出UsupportedOperationException(排序调用集合上的N次设置)。只有在读取90%以上的读数时才应该使用此读数。
我还发现了一个使用ConcurrentSkipListSet的建议,因为它处理并发&排序,但看着JavaDoc我很担心:
请注意,与大多数集合不同,size方法不是常量操作。
我用&非常依赖size()方法。
我可以在效果集合上实现一个手动同步系统作为标准的ArrayList,但这是一个非常大的重构&如果有人有任何想法,我宁愿用尽所有其他可能性吗?感谢你坚持到目前为止。
答案 0 :(得分:2)
可能最好的方法是在您对集合进行排序时手动同步。您可以执行类似(伪代码)的操作:
synchronize {
convert copyonwritearrylist to normal list.
sort normallist.
convert normal list to copyonwritearraylist and replace the shared instance
}
或者你可以使用普通的ArrayList并使用ReentrantReadWriteLock推出自己的解决方案。如果你有更多的读取而不是写入,这应该可行。