Java 什么是允许Collections.sort的线程安全列表实现
我必须写一个需要列表的程序。此列表的实现需要是线程安全的(主要是为了避免ConcurrentModificationException),但也需要允许 由于API原因,要应用的Java 什么是允许Collections.sort的线程安全列表实现,java,sorting,collections,concurrency,Java,Sorting,Collections,Concurrency,我必须写一个需要列表的程序。此列表的实现需要是线程安全的(主要是为了避免ConcurrentModificationException),但也需要允许 由于API原因,要应用的Collections.sort()方法 CopyOnWriteArrayList满足前者,但不满足后者,我发现的其他实现允许后者,但不允许前者 Java有适合我的列表实现吗 编辑:需要注意的重要一点是,不幸的是,我的代码需要与Java 6兼容。我想知道这在概念层面上是否可行:为了使排序操作保持一致,我希望在排序过程中,整
Collections.sort()
方法
CopyOnWriteArrayList满足前者,但不满足后者,我发现的其他实现允许后者,但不允许前者
Java有适合我的列表实现吗
编辑:需要注意的重要一点是,不幸的是,我的代码需要与Java 6兼容。我想知道这在概念层面上是否可行:为了使排序操作保持一致,我希望在排序过程中,整个列表被阻止进行任何添加/删除 但是Collections.sort()不知道在工作时需要锁定整个列表。您给它一个列表,如果另一个线程同时试图修改该列表。。。祝你好运 或者,如果你改变了观点:一个“线程安全”列表应该如何理解它现在正在被排序;所以-一些访问(如交换元素)是可以的;但其他(如添加/删除)元素不是 换句话说:我认为您只能这样做:选择任何“线程安全”列表实现;然后你必须把你自己的包装纸放在合适的地方
所以,你的需求总和似乎无法解决;您必须咬紧牙关,在自己的代码中完成大部分工作。好的,CopyOnWriteArrayList在排序时锁定整个集合(用于插入)。没有 看起来你对CopyOnWriteArrayList很在行。下面是这个类的代码片段-
public void sort(Comparator<? super E> c) {
final ReentrantLock lock = this.lock;
lock.lock();**
try {
Object[] elements = getArray();
Object[] newElements = Arrays.copyOf(elements, elements.length);
@SuppressWarnings("unchecked") E[] es = (E[])newElements;
Arrays.sort(es, c);
setArray(newElements);
} finally {
lock.unlock();
}
}
public void sort(ComparatorIs is use third party libraries a option?@Fildor如果第三方库重量较轻,那么它可能是一个候选库?无需担心-只需阅读您关于显式调用API的评论Collections.sort()
:(不幸的是,从层次上讲,这似乎是Set的实现,而不是List的实现。使用暴露add()/delete()/sort()/getList()/clearList()
方法的singleton。其中一些方法应该同步,其他方法应该有允许或不允许操作的标志(如sort)除非没有调用add/del,否则无法工作。您可以使用一些布尔标志来处理此问题。您可以添加指向此代码段源代码的链接吗?这很酷-此方法实际上是用Java8添加的;我还不知道它。输入很棒!还要注意,在Java8中,Collections.sort(foo)
委托给List.sort(…)
,因此调用该方法也应该很好。刚才添加的OP,代码需要与Java 6兼容:(不幸的是,API实现将专门尝试在其上调用Collections.sort()。我无法改变这一点。我还必须维护与Java 6兼容的代码库。