Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么是允许Collections.sort的线程安全列表实现_Java_Sorting_Collections_Concurrency - Fatal编程技术网

Java 什么是允许Collections.sort的线程安全列表实现

Java 什么是允许Collections.sort的线程安全列表实现,java,sorting,collections,concurrency,Java,Sorting,Collections,Concurrency,我必须写一个需要列表的程序。此列表的实现需要是线程安全的(主要是为了避免ConcurrentModificationException),但也需要允许 由于API原因,要应用的Collections.sort()方法 CopyOnWriteArrayList满足前者,但不满足后者,我发现的其他实现允许后者,但不允许前者 Java有适合我的列表实现吗 编辑:需要注意的重要一点是,不幸的是,我的代码需要与Java 6兼容。我想知道这在概念层面上是否可行:为了使排序操作保持一致,我希望在排序过程中,整

我必须写一个需要列表的程序。此列表的实现需要是线程安全的(主要是为了避免ConcurrentModificationException),但也需要允许 由于API原因,要应用的
Collections.sort()
方法

CopyOnWriteArrayList满足前者,但不满足后者,我发现的其他实现允许后者,但不允许前者

Java有适合我的列表实现吗


编辑:需要注意的重要一点是,不幸的是,我的代码需要与Java 6兼容。

我想知道这在概念层面上是否可行:为了使排序操作保持一致,我希望在排序过程中,整个列表被阻止进行任何添加/删除

但是Collections.sort()不知道在工作时需要锁定整个列表。您给它一个列表,如果另一个线程同时试图修改该列表。。。祝你好运

或者,如果你改变了观点:一个“线程安全”列表应该如何理解它现在正在被排序;所以-一些访问(如交换元素)是可以的;但其他(如添加/删除)元素不是

换句话说:我认为您只能这样做:选择任何“线程安全”列表实现;然后你必须把你自己的包装纸放在合适的地方

  • “锁定”列表以进行更改
  • 分拣行吗
  • “解锁”列表
  • 当然,对于“2”;您可以自由使用Collections.sort()

    或者,如果您使用的是Java8,那么您可以使用CopyOnWriteArrayList及其已经实现的sort()方法(这有点证明了我的观点:只有在运行排序操作时拥有列表,才能进行正确的排序!)

    给出您的最新评论:当然,您可以手动将CopyOnWriteArrayList的Java8版本“后传”到您的环境中并使用它;但当然,这不会有帮助;据我所知,Java6 Collections.sort()不会从该类调用新的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兼容的代码库。